Специальные символы XSLT

В следующем преобразовании XSL, как я произвожу' <' и'>' символ?

Вход XML:

<TestResult bugnumber="3214" testname="display.methods::close->test_ManyInvoke" errortype="Failure"><ErrorMessage><![CDATA[calling close() method failed - expected:<2>]]></ErrorMessage>

XSLT:

<xsl:template match="TestResult">
  <xsl:variable name="errorMessage">
   <xsl:value-of select="ErrorMessage" disable-output-escaping="yes"/>
  </xsl:variable>
  <Test name='{@testname}'>
   <TestResult>
    <Passed>false</Passed>
    <State>failure</State>
    <Metadata>
     <Entry name='bugnumber' value='{@bugnumber}' />
    </Metadata>
    <TestOutput>
     <Metadata>
      <Entry name='ErrorMessage' value='{$errorMessage}' />
     </Metadata>
    </TestOutput>
   </TestResult>
  </Test>
 </xsl:template>

Вывод XML:

<Test name="display.methods::close-&gttest_ManyInvoke"> 
 <TestResult>
  <Passed>false</Passed>
  <State>failure</State>
  <Metadata>
   <Entry name="bugnumber" value="3214"/>
  </Metadata>
  <TestOutput>
   <Metadata>
    <Entry name="ErrorMessage" value="calling close() method failed - expected:&lt;2&gt;"/>
   </Metadata>
  </TestOutput>
 </TestResult>
</Test>
7
задан Apurv 28 May 2010 в 00:58
поделиться

2 ответа

Краткий ответ : Вы не можете.

Длинный ответ : значение атрибутов не может содержать несколько специальных символов, например '<' , '>' и '&' .

Если они присутствуют, они экранируются как: '<' , '>' и '&' .

Эти символы могут быть созданы, если метод вывода - «текст», что не в вашем случае.

Текст, который выглядит как эти символы при отображении в браузере, также может быть создан: используйте: '<' , '>' и '&' .

Наконец, вы можете создать эти символы как часть текстового узла, используя секцию CDATA . Следующий пример иллюстрирует это:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <xsl:output cdata-section-elements="t"
  omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <t> &lt; &amp; &gt;</t>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любому XML-документу (не используется), результат будет следующим:

<t><![CDATA[ < & >]]></t>
10
ответ дан 6 December 2019 в 19:33
поделиться

Если тот факт, что > отображается в ваших атрибутах, является проблемой, проблема заключается в том, как используется XML, а не в том, как он создается.

Любой синтаксический анализатор XML будет отменять экранирование экранированных символьных сущностей, когда он используется для получения значения атрибута. Если вы используете XML-синтаксический анализатор при использовании XML-документа, вы никогда этого не увидите; парсер сообщит вам, что значение атрибута равно display.methods :: close-> test_ManyInvoke .

Мне кажется вероятным, что эта «проблема» возникает только по одной из двух причин:

  1. Кто-то, кто не понимает, как работает XML, смотрит на результат и говорит: «Эй, это не должно быть делать это »

  2. . Тот, кто не понимает, как работает XML, написал свою собственную логику для синтаксического анализа XML. («Зачем мне использовать чужой XML-синтаксический анализатор, если я могу просто написать простое регулярное выражение?» Ну, это одна из причин, почему.)

Как правило, если вы когда-нибудь обнаружите, что используете , отключите -output-escaping = 'yes' в XSLT или создавая разделы CDATA, вы, вероятно, делаете неправильные вещи. Это не определенно - есть подходящие применения для обоих - но, по моему опыту, в подавляющем большинстве случаев, если ответ - «используйте CDATA», вы задаете неправильный вопрос.

2
ответ дан 6 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: