需要提取单引号后的文本。
例如:
<div>('show')</div>
变量是这样的:
<xsl:variable name="showName" select="substring-before(substring-after(//x:div, '%28%27'), '%27%29')" />
结果是无,编码字符。
我认为它不能用于%28%27和%27%29。这是对的?。
谢谢。
XSLT 1.0:
只需使用:
<xsl:variable name="vshowName" select=
'substring-before(substring-after(/*, "'"), "'")'/>
这是一个完整的转换:
<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(/*, "'"), "'")'/>
<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(/*, "^[^']*'([^']*)'.*$", "$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)
如果您熟悉正则表达式,您也可以使用<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>