2013-12-03 4 views
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(), он показывает результат Нан, поскольку в конце столбца имеется pt, мне нужно использовать translate(), а затем функцию sum(), пожалуйста, дайте мне знать, как я могу это сделать.

Благодаря

ответ

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, потому что вы можете установить только нулевой узел, вы не можете массировать отдельные значения перед их суммированием. В 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" /> 
+0

Привет @Ian, Спасибо за ваш ответ, но здесь она просто дает 0, я использую это, давая мне тот же номер, что и colwidth, но не сумма, просто хочу знать, мне нужно добавить цикл for-each? – user2423959

+0

также, когда я использую '

' из тега colspan, он дает мне вывод как '
2070102075
' – user2423959

+0

@ user2423959: Поскольку мое решение работало в первом контексте, но не во втором контексте, я думаю, вам нужно выбрать свой _current node_ прямо перед вами позвоните либо мне, либо моему решению. –

Смежные вопросы