【问题标题】:how to escape single quote in xslt substring function如何在 xslt 子字符串函数中转义单引号
【发布时间】:2012-09-06 09:35:45
【问题描述】:

我尝试在 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:'--->'<---

【问题讨论】:

  • 你试过双引号“''”吗?
  • 是的,我试过了得到编译错误
  • @prabhu,即使在字符串同时包含引号和撇号的最复杂情况下,也可以使用单个 XPath 1.0 表达式提取数字 - 不使用任何完全可变。

标签: xslt xpath


【解决方案1】:

转义的一般规则是:

在 1.0 中:

  • 如果您希望字符串文字中的属性分隔符,请使用 XML 转义形式 &amp;quot;&amp;apos;
  • 如果您想在字符串文字中使用字符串分隔符,那您就完蛋了

在 2.0 中:

  • 如果您希望字符串文字中的属性分隔符,请使用 XML 转义形式 &amp;quot;&amp;apos;
  • 如果您想在字符串文字中使用字符串分隔符,请将其加倍(对于 例如,“我不能”)

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

【讨论】:

  • Michael,实际上,即使在字符串同时包含引号和撇号的最复杂情况下,也可以使用单个 XPath 1.0 表达式提取数字——根本不使用任何变量。
  • 可能,是的,但只有通过大量使用实体引用,代码变得完全不可读。为什么变量如此糟糕呢? - 一个好的处理器会内联它们。
  • 我对使用变量没有任何反对意见 - 只是解决了您的声明,即“如果您想在字符串文字中使用字符串定界符,那么您就完蛋了”。很抱歉试图准确。
【解决方案2】:

这应该可行:

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

...

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

【讨论】:

  • 不确定 XPath 1.0 规则 - 可能它也可能是一个没有特殊变量的更简单的解决方案
【解决方案3】:

您可以尝试在 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;", "")'/> 

不一定更好,但它确实消除了对变量的需求。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案5】:

      只是给我未来的自己(或任何其他人)的便条,提醒他们对我有用的确切语法,他们会从中受益。

      声明这个变量

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

      并在这样的条件下使用它

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

      【讨论】:

      • 这是一个很好的答案,谢谢尼克。
      • (我不敢相信几周后我来到这里寻找相同的答案,并想,“我应该将此答案标记为正确”,结果发现我已经这样做了:)
      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多