在XSLT中的单引号之间提取文本

时间:2013-03-23 23:02:50

标签: xslt

需要在单引号之后提取文本。

E.g:

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

变量是这样的:

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

结果是无,encoding caracters

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

感谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

技术

如果您熟悉regular expression,也可以使用<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>