使用translate添加属性值

时间:2013-12-03 09:17:06

标签: xslt-1.0 xslt-2.0

我有以下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()函数,请告诉我我怎么做。

由于

1 个答案:

答案 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" />