如何在xslt substring函数中转义单引号

时间:2012-09-13 10:05:47

标签: xslt xpath

我尝试在XSLT中使用单引号对数据进行子串:

String : DataFromXML:'12345'

预期结果:12345

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/>

结果:'12345'

我试过下面的代码

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&#39;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&apos;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>

错误:

String literal was not closed 'DataFromXML:'--->'<---

5 个答案:

答案 0 :(得分:23)

逃避的一般规则是:

在1.0:

  • 如果要在字符串文字中使用属性分隔符,请使用XML 转义表单&quot;&apos;
  • 如果你想在字符串文字中使用字符串分隔符,那么你就是

在2.0中:

  • 如果要在字符串文字中使用属性分隔符,请使用XML 转义表单&quot;&apos;
  • 如果你想在字符串文字中使用字符串分隔符,请将其加倍(for 例如,'我不能')

使用Vitaliy显示的变量$ quot或$ apos可以使代码更清晰。

答案 1 :(得分:10)

这应该有效:

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

...

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" />

答案 2 :(得分:8)

您可以尝试在 xsl:value-of

中交换和“和”
<xsl:value-of select='substring-before
   (substring-after($datafromxml,"DataFromXML:&apos;"), "&apos;")'/> 

或者,您可以使用translate函数删除讨厌的撇号

 <xsl:value-of select='translate
    (substring-after($datafromxml,"DataFromXML:"), "&apos;", "")'/> 

不一定更好,但确实不需要变量。

答案 3 :(得分:4)

即使在最复杂的情​​况下 - 字符串同时包含引号和撇号 - 可以在不诉诸变量的情况下提取数字

假设我们有这个XML文档:

<t>' "12345' "</t>

并且想要解释数字。

在以下转换中,我们使用单个XPath表达式来完成:

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

 <xsl:template match="text()">
     <xsl:value-of select=
     'substring-after(.,"&apos;")
     '/>
==============  
     <xsl:value-of select=
     'substring-before(
       substring-after(substring-after(.,"&apos;"), &apos;&quot;&apos;),
       "&apos;"
                       )
     '/>
 </xsl:template>
</xsl:stylesheet>

结果是

 "12345' "
==============  
     12345

请注意:我故意有两个XPath表达式 - 第一个的目的是让它更容易理解第二个XPath表达式中表达的内容。只留下模板主体中的最后一个xsl:value-of会产生所需的结果:

12345

答案 4 :(得分:0)

只是我未来的自己(或其他任何人)的笔记,他会从提醒我的精确语法中受益。

声明此变量

<xsl:variable name="apos" select='"&apos;"'/>

并在这种情况下使用它

<xsl:if test="$value = concat('G-2', $apos, 'd')">89594</xsl:if>