XSLT特殊字符

Apu*_*urv 7 xml xslt

在下面的XSL转换中,如何输出'<'和'>'符号?

输入XML:

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

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>
Run Code Online (Sandbox Code Playgroud)

输出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>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 10

简答:你做不到.

答案很长:属性的值不能包含一些特殊字符,例如'<','>''&'.

如果存在,它们将被转义为:'&lt;','&gt;''&amp;'.

如果输出方法是"text",则可以生成这些字符,这不是您的情况.

在浏览器中显示时看起来像这些字符的文本也可以生成:use:'&lt;','&gt;'and '&amp;'.

最后,您可以使用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>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于任何XML文档(未使用)时,结果为:

<t><![CDATA[ < & >]]></t>
Run Code Online (Sandbox Code Playgroud)


GMK*_*GMK 5

这是一个非常古老的问题,其他评论者可能正确地质疑为什么你需要这个,但如果你只是想知道如何在输出中添加 < 或 > ,那么你可以这样做。

<xsl:value-of disable-output-escaping="yes" select="string('&lt;')"/>
Run Code Online (Sandbox Code Playgroud)

更多信息请访问MSDN 站点