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