给出以下XML:
<table>
<col width="12pt"/>
<col width="24pt"/>
<col width="12pt"/>
<col width="48pt"/>
</table>
如何将width属性转换为可在数学表达式中使用的数值?到目前为止,我已使用substring-before
来执行此操作。这是一个示例模板(仅限XSLT 2.0),它显示了如何对值进行求和:
<xsl:template match="table">
<xsl:text>Col sum: </xsl:text>
<xsl:value-of select="sum(
for $w
in col/@width
return number(substring-before($w, 'pt'))
)"/>
</xsl:template>
现在我的问题:
substring-before
更有效的转化方式?答案 0 :(得分:2)
这太可怕了,但是根据你对一组非数字字符的了解程度,你可以用translate()
剥离它们:
translate("12jfksjkdfjskdfj", "abcdefghijklmnopqrstuvwxyz", "")
返回
"12"
然后您可以将其传递给number()
。
(我说它太可怕了。请注意,translate()
也区分大小写)
答案 1 :(得分:1)
如果您使用的是XSLT 2.0,是否有理由避免使用正则表达式?
最简单的解决方案可能是使用带有正则表达式模式的 replace function 匹配任何非数字字符并替换为空字符串:
replace($w,'[^0-9]','')
答案 2 :(得分:1)
我从this answer找到了Dimitre Novatchev,它提供了一个非常聪明的XPATH解决方案,它不使用正则表达式:
translate(., translate(.,'0123456789', ''), '')
它使用嵌套的translate来删除字符串中的所有数字,这会产生所有其他字符,这些字符用作包装转换函数的值,用于去除并仅返回数字字符。
应用于您的模板:
<xsl:template match="table">
<xsl:text>Col sum: </xsl:text>
<xsl:value-of select="sum(
for $w
in col/@width
return number(translate($w, translate($w,'0123456789', ''), ''))
)"/>
</xsl:template>