我有以下xml
<table>
<tgroup cols="7" align="left" colsep="1" rowsep="1">
<colspec colwidth="20pt" colname="c1"/>
<colspec colwidth="70pt" colname="c2"/>
<colspec colwidth="10pt" colname="c3"/>
<colspec colwidth="20pt" colname="c4"/>
<colspec colwidth="75pt" colname="c5"/>
</tgroup>
</table>
这里我想添加所有的colwidths。
当我使用sun()
时,它会显示Nan结果,因为结尾处的colwidth有pt
,我需要使用translate()
然后使用sum()
函数,请告诉我我怎么做。
由于
答案 0 :(得分:2)
基本上你正在尝试为每个colspec
做一些事情,从其pt
中删除尾随colwidth
并转换为数字,然后将所有结果数字相加一起”。在XSLT 2.0中,您可以使用
sum(path/to/colspec/xs:integer(substring-before(@colwidth, 'pt')))
(或xs:decimal
如果colwidths不是所有整数) - path/to/colspec
需要替换为从当前上下文节点到所有colspec
元素集的正确路径。如果您目前位于tgroup/colspec
元素上,则可能为table
;如果您当前位于../colspec
个元素之一,则可能为colspec
。
在XSLT 1.0中,您无法在单个XPath表达式中执行此操作,因为您只能sum
直接设置节点,在对它们求和之前无法按下各个值。在1.0中,我可能会选择带累加器参数的尾递归模板:
<xsl:template match="colspec" mode="sumwidth">
<xsl:param name="total" select="0" />
<xsl:apply-templates select="following-sibling::colspec[1]" mode="sumwidth">
<xsl:with-param name="total"
select="$total + substring-before(@colwidth, 'pt')" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="colspec[not(following-sibling::colspec)]" mode="sumwidth">
<xsl:param name="total" select="0" />
<xsl:value-of select="$total + substring-before(@colwidth, 'pt')" />
</xsl:template>
然后使用
调用它<xsl:apply-templates select="colspec[1]" mode="sumwidth" />