25

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

5 回答 5

25

逃生的一般规则是:

在 1.0 中:

  • 如果您希望字符串文字中的属性分隔符,请使用 XML 转义形式&quot;&apos;
  • 如果你想在字符串文字中使用字符串分隔符,你会被淹没

在 2.0 中:

  • 如果您希望字符串文字中的属性分隔符,请使用 XML 转义形式&quot;&apos;
  • 如果您想要字符串文字中的字符串分隔符,请将其加倍(例如,'I can''t')

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

于 2012-09-13T12:37:04.730 回答
11

这应该有效:

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

...

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" />
于 2012-09-13T10:25:41.983 回答
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;", "")'/> 

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

于 2012-09-13T11:27:47.863 回答
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
于 2012-09-13T12:53:45.887 回答
1

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

声明这个变量

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

并在这样的条件下使用它

<xsl:if test="$value = concat('G-2', $apos, 'd')">89594</xsl:if>
于 2019-02-05T14:55:01.007 回答