Как сложить, если мы используем функцию подстроки - PullRequest
0 голосов
/ 23 мая 2011

Я хочу спросить, как получить общую сумму, если мы используем функцию подстроки, например, у меня есть этот xml,

<document>

    <line id="0">
        <field id="0"><![CDATA[AAAddd17aaass]]></field>
    </line>
    <line id="1">
        <field id="0"><![CDATA[DDDaaa33sssaa]]></field>
    </line>
</document>

Я должен суммировать (подстрока (поле [@ id = '0'],7,2)).Затем я пытаюсь сделать это, я получаю это сообщение об ошибке: Текущий элемент 'NaN типа xs: string.(Я пытаюсь использовать числовую функцию, но она не помогает)

Пожалуйста, посоветуйте мне, как ее решить.

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Easy в XSLT 2.0:

sum(field[@id='0']/number(substring(., 7,2)))

Довольно сложнее в XSLT 1.0: см., Например, http://www.velocityreviews.com/forums/t170401-sum-over-computed-value.html

1 голос
/ 24 мая 2011

В XSLT 1.0, если вы не хотите писать рекурсивные шаблоны самостоятельно, вы можете использовать шаблон transform-and-sum из FXSL .

Смотрите, как его использовать здесь .


Вот полное преобразование :

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:func-transform="f:func-transform"
exclude-result-prefixes="xsl f func-transform"
>
   <xsl:import href="transform-and-sum.xsl"/>

   <!-- to be applied on testTransform-and-sum.xml -->

   <xsl:output method="text"/>

   <func-transform:func-transform/>

    <xsl:template match="/">
      <xsl:call-template name="transform-and-sum">
        <xsl:with-param name="pFuncTransform"
                        select="document('')/*/func-transform:*[1]"/>
        <xsl:with-param name="pList" select="/*/*/*"/>
      </xsl:call-template>
    </xsl:template>

    <xsl:template match="func-transform:*" mode="f:FXSL">
      <xsl:param name="arg1" select="0"/>
      <xsl:value-of select="number(substring($arg1, 7,2))"/>
    </xsl:template>

</xsl:stylesheet>

при применении к предоставленному документу XML :

<document>
    <line id="0">
        <field id="0"><![CDATA[AAAddd17aaass]]></field>
    </line>
    <line id="1">
        <field id="0"><![CDATA[DDDaaa33sssaa]]></field>
    </line>
</document>

желаемый, правильный результат получается :

50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...