По сути вы пытаетесь сделать что-то вроде «для каждого 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, потому что вы можете установить только нулевой узел, вы не можете массировать отдельные значения перед их суммированием. В 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" />
Привет @Ian, Спасибо за ваш ответ, но здесь она просто дает 0, я использую это, давая мне тот же номер, что и colwidth, но не сумма, просто хочу знать, мне нужно добавить цикл for-each? – user2423959
также, когда я использую '
@ user2423959: Поскольку мое решение работало в первом контексте, но не во втором контексте, я думаю, вам нужно выбрать свой _current node_ прямо перед вами позвоните либо мне, либо моему решению. –