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

时间:2016-01-08 09:35:52

标签: xml xslt xpath xslt-2.0 xpath-2.0

我正在尝试通过字符串中的XPath函数删除前导章节号,看起来像这样

<heading>Some Heading</heading>
<heading>some Heading 4 Something</heading>
<heading>Another One</heading>
<heading>For good Measure 2</heading>

我希望的输出看起来像这样

document.getElementById('name').focus();

到目前为止,我已经尝试了 translate() string-after(),但字符串内部或结尾处的数字正在扼杀我。 我很感激你的每一个帮助!

2 个答案:

答案 0 :(得分:1)

如果您真的使用的是XSLT 2.0,请使用replace

<xsl:template match="heading">
  <xsl:copy>
    <xsl:value-of select="replace(., '^[\s.\d]+', '')"/>
  </xsl:copy>
</xsl:template>

答案 1 :(得分:1)

这是一个纯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>