【问题标题】:XSLT special charactersXSLT 特殊字符
【发布时间】:2011-02-24 22:39:11
【问题描述】:

在下面的 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>

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案以获得完整的解决方案。

标签: xml xslt


【解决方案1】:

简答:你不能。

长答案:属性值不能包含'&amp;lt;''&amp;gt;''&amp;amp;'等少数特殊字符。

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

如果输出方法是'text',则可以产生这些字符,这不是你的情况。

还可以生成在浏览器中显示时类似于这些字符的文本:使用:'&amp;lt;''&amp;gt;''&amp;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>

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

<t><![CDATA[ < & >]]></t>

【讨论】:

    【解决方案2】:

    这是一个非常古老的问题,其他评论者可能会质疑您为什么需要这个问题,但如果您只想知道如何在输出中添加 ,这就是您的操作方法。

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

    更多信息请访问MSDN site

    【讨论】:

      【解决方案3】:

      如果&amp;gt; 出现在您的属性中是一个问题,那么问题在于如何使用 XML,而不是如何生成它。

      任何 XML 解析器在用于检索属性值时都会取消转义转义字符实体。如果您在使用 XML 文档时使用 XML 解析器,您将永远不会看到这一点;解析器会告诉你属性的值为display.methods::close-&gt;test_ManyInvoke

      在我看来,这个“问题”似乎只是出于以下两个原因之一:

      1. 不了解 XML 工作原理的人看着输出并说:“嘿,它不应该那样做。”

      2. 不了解 XML 工作原理的人编写了自己的逻辑来解析 XML。 (“我可以写一个简单的正则表达式,为什么还要使用别人的 XML 解析器?”嗯,这就是原因之一。)

      一般来说,如果您发现自己在 XSLT 中使用 disable-output-escaping='yes' 或创建 CDATA 部分,那么您可能做错了事。这不是确定 - 两者都有适当的用途 - 但根据我的经验,如果答案是“使用 CDATA”,那么绝大多数情况下你都在问错误的问题。

      【讨论】:

        【解决方案4】:

        如果您试图在字符串文字中转义除与号之外的任何内容,请小心。例如,

        test="$some_variable = 'Wendy&apos;s'"
        

        行不通。您必须在转义字符串中转义第一个&符号,因此您需要使用

        test="$some_variable = 'Wendy&amp;apos;s'
        

        【讨论】:

          【解决方案5】:

          毫无疑问,如果有人需要括号的输出。我使用 XSLT 生成纯文本,并且非常确定我需要输出什么,但 XslCompiledTransform class 只是出于任何原因对其进行编码。

          作为 GMK 答案的一个更简短的替代方案,我想出了:

          <xsl:text disable-output-escaping="yes">&lt; ... &gt;</xsl:text>
          

          MSDN site

          上下文示例:

          <xsl:template match="data">
                  /// <xsl:text disable-output-escaping="yes">&lt;summary&gt;</xsl:text>
                  ///     <xsl:value-of select="value"/>
                  /// <xsl:text disable-output-escaping="yes">&lt;/summary&gt;</xsl:text>
                  public static <xsl:text disable-output-escaping="yes">Func&lt;string&gt; </xsl:text><xsl:value-of select="@name"/>
                  <xsl:text disable-output-escaping="yes"> =&gt; () =&gt;</xsl:text> I18n.<xsl:value-of select="@name"/>;
          </xsl:template>
          

          这部分为 C# 资源文件生成类似这样的内容。

                  /// <summary>
                  ///     Abbrechen
                  /// </summary>
                  public static Func<string> Abort => () => I18n.Abort;
          

          【讨论】:

            猜你喜欢
            • 2018-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-18
            相关资源
            最近更新 更多