concat,引号和撇号组合问题

时间:2012-01-09 01:40:34

标签: xslt concat

我尝试了不同的方式,也环顾四周但却无法运行。 我需要了解以下内容:

"concat( 
    'this is; \"a sample',
    //XML_NODE,
    '\"; \"using an apostrophe',
    ''',
    'in text\"'
)"

一行版本:

"concat( 'this is; \"a sample', //XML_NODE, '\"; \"using an apostrophe', ''', 'in text\"' )"

输出应为:

this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"

问题是'在文中。 concat使用它来结束字符串并期望跟随;或者结束。转义或HTML实体似乎都不起作用。

非常感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分:7)

在XML / XSLT中,您不会使用反斜杠转义字符。

  • 在XML中,您可以使用实体引用。
  • 在XSLT中,您可以使用实体引用和变量。

concat字符串中的撇号问题是加载XSLT的XML解析器会在XSLT引擎评估concat之前扩展它。所以你不能使用撇号字符的实体引用,除非它用双引号括起来(或双引号的实体引用,如Dimitre Novatchev的答案所示)。

  • 使用实体参考"作为双引号"
  • 为撇号字符创建一个变量,并将该变量作为concat()的一个组件引用

在XSLT的上下文中应用:

<xsl:variable name="apostrophe">'</xsl:variable>

<xsl:value-of select="concat( 
            'this is; &quot;a sample',
            //XML_NODE,
            '&quot;; &quot;using an apostrophe ',
            $apostrophe,
            ' in text&quot;'
            )" />

如果你需要一个100%的XPath解决方案来避免使用XSLT变量,那么Dimitre的答案是最好的。

如果您担心阅读,理解和维护是多么容易,那么Michael Kay建议将XSLT变量用于引用和撇号可能是最好的。

答案 1 :(得分:6)

无需变量

以下是如何以两种方式生成所需输出的示例:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:text>this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"</xsl:text>
  =============
  <xsl:value-of select=
   "concat('this is ',
           '&quot;a sample XML_NODE_VALUE&quot;; &quot;',
           &quot;using an apostrophe &apos; in text&quot;,
           '&quot;'
          )
   "/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于任何XML文档(未使用)时,生成所需的输出

this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"
=============
this is "a sample XML_NODE_VALUE"; "using an apostrophe ' in text"

答案 2 :(得分:4)

我发现最简单的解决方案是声明变量:

<xsl:variable name="apos">'</xsl:variable>
<xsl:variable name="quot">"</xsl:variable>
<xsl:value-of select="concat('This is ', $quot, "a sample using ", $apos)"/>