В следующем преобразовании 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->test_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:<2>"/>
</Metadata>
</TestOutput>
</TestResult>
</Test>
Краткий ответ : Вы не можете.
Длинный ответ : значение атрибутов не может содержать несколько специальных символов, например '<'
, '>'
и '&'
.
Если они присутствуют, они экранируются как: '<'
, '>'
и '&'
.
Эти символы могут быть созданы, если метод вывода - «текст», что не в вашем случае.
Текст, который выглядит как эти символы при отображении в браузере, также может быть создан: используйте: '<'
, '>'
и '&'
.
Наконец, вы можете создать эти символы как часть текстового узла, используя секцию 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> < & ></t>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к любому XML-документу (не используется), результат будет следующим:
<t><![CDATA[ < & >]]></t>
Если тот факт, что >
отображается в ваших атрибутах, является проблемой, проблема заключается в том, как используется XML, а не в том, как он создается.
Любой синтаксический анализатор XML будет отменять экранирование экранированных символьных сущностей, когда он используется для получения значения атрибута. Если вы используете XML-синтаксический анализатор при использовании XML-документа, вы никогда этого не увидите; парсер сообщит вам, что значение атрибута равно display.methods :: close-> test_ManyInvoke
.
Мне кажется вероятным, что эта «проблема» возникает только по одной из двух причин:
Кто-то, кто не понимает, как работает XML, смотрит на результат и говорит: «Эй, это не должно быть делать это »
. Тот, кто не понимает, как работает XML, написал свою собственную логику для синтаксического анализа XML. («Зачем мне использовать чужой XML-синтаксический анализатор, если я могу просто написать простое регулярное выражение?» Ну, это одна из причин, почему.)
Как правило, если вы когда-нибудь обнаружите, что используете , отключите -output-escaping = 'yes'
в XSLT или создавая разделы CDATA, вы, вероятно, делаете неправильные вещи. Это не определенно - есть подходящие применения для обоих - но, по моему опыту, в подавляющем большинстве случаев, если ответ - «используйте CDATA», вы задаете неправильный вопрос.