格式化字符串 - 删除前导数字
formatting string - remove leading numbers
我正在尝试通过 XPath 函数从字符串中删除前导章节编号,如下所示
<heading>3 Some Heading</heading>
<heading>5.2 some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
我想要的输出看起来像这样
<heading>Some Heading</heading>
<heading>some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
到目前为止,我已经尝试了 translate() 和 string-after(),但是里面的数字或者到弦乐死我了。
我很感激你的帮助!
使用replace
,如果你真的使用XSLT 2.0
<xsl:template match="heading">
<xsl:copy>
<xsl:value-of select="replace(., '^[\s.\d]+', '')"/>
</xsl:copy>
</xsl:template>
这是一个纯粹的 XSLT 1.0 解决方案(使用 XSLT 2.0 处理器也能产生正确的结果):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"text()[number(translate(substring-before(., ' '), '.', ''))
= number(translate(substring-before(., ' '), '.', ''))]">
<xsl:value-of select="substring-after(., ' ')"/>
</xsl:template>
</xsl:stylesheet>
不使用 RegEx 的纯 XSLT 2.0 解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"text()[translate(substring-before(., ' '), '.', '') castable as xs:integer]">
<xsl:value-of select="substring-after(., ' ')"/>
</xsl:template>
</xsl:stylesheet>
当对以下 XML 文档应用上述任何转换时:
<t>
<heading>3 Some Heading</heading>
<heading>5.2.1 some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
<heading>NoSpace</heading>
</t>
产生了想要的、正确的结果:
<t>
<heading>Some Heading</heading>
<heading>some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
<heading>NoSpace</heading>
</t>
我正在尝试通过 XPath 函数从字符串中删除前导章节编号,如下所示
<heading>3 Some Heading</heading>
<heading>5.2 some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
我想要的输出看起来像这样
<heading>Some Heading</heading>
<heading>some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
到目前为止,我已经尝试了 translate() 和 string-after(),但是里面的数字或者到弦乐死我了。 我很感激你的帮助!
使用replace
,如果你真的使用XSLT 2.0
<xsl:template match="heading">
<xsl:copy>
<xsl:value-of select="replace(., '^[\s.\d]+', '')"/>
</xsl:copy>
</xsl:template>
这是一个纯粹的 XSLT 1.0 解决方案(使用 XSLT 2.0 处理器也能产生正确的结果):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"text()[number(translate(substring-before(., ' '), '.', ''))
= number(translate(substring-before(., ' '), '.', ''))]">
<xsl:value-of select="substring-after(., ' ')"/>
</xsl:template>
</xsl:stylesheet>
不使用 RegEx 的纯 XSLT 2.0 解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"text()[translate(substring-before(., ' '), '.', '') castable as xs:integer]">
<xsl:value-of select="substring-after(., ' ')"/>
</xsl:template>
</xsl:stylesheet>
当对以下 XML 文档应用上述任何转换时:
<t>
<heading>3 Some Heading</heading>
<heading>5.2.1 some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
<heading>NoSpace</heading>
</t>
产生了想要的、正确的结果:
<t>
<heading>Some Heading</heading>
<heading>some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>
<heading>NoSpace</heading>
</t>