4

需要提取单引号后的文本。

例如:

<div>('show')</div>

变量是这样的:

<xsl:variable name="showName" select="substring-before(substring-after(//x:div, '%28%27'), '%27%29')" />

结果是无,编码字符

我认为它不能用于%28%27%27%29。这是对的?。

谢谢。

4

2 回答 2

5

XSLT 1.0

只需使用

 <xsl:variable name="vshowName" select=
 'substring-before(substring-after(/*, "&apos;"), "&apos;")'/>

这是一个完整的转换:

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

 <xsl:variable name="vshowName" select=
 'substring-before(substring-after(/*, "&apos;"), "&apos;")'/>

 <xsl:template match="/*">
  <xsl:value-of select="$vshowName"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<div>('show')</div>

产生了想要的正确结果

show

XSLT 2.0

在 XSLT 2.0 中,可以使用以下两种方法之一:

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

 <xsl:variable name="vPattern">
  ^[^']*'([^']*)'.*$
 </xsl:variable>

 <xsl:variable name="vshowName1" select="replace(/*, $vPattern, '$1', 'x')"/>

 <xsl:variable name="vshowName2" select=
 'replace(/*, "^[^&apos;]*&apos;([^&apos;]*)&apos;.*$", "$1", "x")'/>

 <xsl:template match="/*">
  <xsl:value-of select="$vshowName2"/>
===============
  <xsl:value-of select="$vshowName1"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于同一个 XML 文档(上图)时,两个 XPath 表达式的求值产生相同的结果

show
===============
show

请注意

如果您想使用单个 Xpath 表达式xsl:analyze-string不需要)来提取/处理用引号括起来的所有子字符串(其中可能存在无限数量的此类子字符串),请参阅此答案:

https://stackoverflow.com/a/15402185/36305

最后,使用xsl:analyze-string

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:analyze-string select="." regex="'(.*?)'">
   <xsl:matching-substring>
     <xsl:sequence select="regex-group(1)"/>
   </xsl:matching-substring>
  </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时:

<div>('word1', 'word2', 'word3')</div>

产生正确的结果

word1 word2 word3

此代码(来自另一个答案)是错误的

<xsl:analyze-string select="//div" regex="'(.*)'">
  <xsl:matching-substring>
    <xsl:value-of select="regex-group(1)"/>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>

当应用于上述 XML 文档时,它会产生:

(word1', 'word2', 'word3)
于 2013-03-23T23:49:03.863 回答
0

技术

如果您熟悉正则表达式,您也可以使用<xsl:analyze-string>.

代码示例

提取单引号之间的内容。regex-group(1)稍后使用)引用该内容:

<xsl:analyze-string select="//x:div" regex="'(.*)'">
  <xsl:matching-substring>
    <xsl:value-of select="regex-group(1)"/>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>
于 2013-03-24T00:32:58.430 回答