有没有办法在xslt中检测数字字符串?

时间:2011-11-04 14:51:18

标签: html xml regex xslt xpath

我现在正在做xml xslt转换的html,非常直截了当。但我有一个未解决的小问题。

例如,在我的源代码html中,节点如下所示:

<p class="Arrow"><span class="char-style-override-12">4</span><span class="char-style-override-13"> </span>Sore, rash, growth, discharge, or swelling.</p>

如您所见,第一个子节点&lt;跨度&GT;它的值为4,它实际上是在浏览器中呈现为箭头点(可能是某些编码问题,它在我的xml编辑器中被视为数值)。

所以我的问题是,我写了一个模板来匹配标签,然后将它的文本内容传递给另一个模板匹配:

 <xsl:template match="text()">
    <xsl:variable name="noNum">
        <xsl:value-of select="normalize-space(translate,'4',''))"/>
    </xsl:variable>
 <xsl:copy-of select="$noNum"/>    
  </xsl:template>  

正如您所看到的,这绝对不是一个好的解决方案,它将替换字符串中出现的所有数字,而不仅仅是第一个字符。所以我想知道是否有一种方法只删除第一个字符,如果它是一个数字,也许使用正则表达式?或者,我实际上走错了方向,是否有更好的方法来考虑解决这个问题(例如,改变编码)?

欢迎任何想法!提前谢谢!

2 个答案:

答案 0 :(得分:6)

请使用:

<xsl:variable name="test">4y4145</xsl:variable>
<xsl:if test= "not(string(number(substring($test,1,1)))='NaN')">
    <xsl:message terminate="no">
              <xsl:value-of select="substring($test,2)"/>
    </xsl:message>
</xsl:if>

这是一个XSLT 1.0解决方案。我认为正则表达式对此有点过分了。

输出:

[xslt]                           y4145

答案 1 :(得分:3)

使用此单个XPath表达式

concat(translate(substring(.,1,1), '0123456789', ''),
       substring(.,2)
       )
相关问题