格式化字符串 - 删除前导数字

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>