2

単純な問題だと思っていたのに立ち往生しています。ここにxmlデータがあります

<?xml version="1.0" encoding="UTF-8"?>
<report endDate="2013/02/01 15:10:14" environment="Q000" startDate="2013/01/25 15:10:14">
<distrib appCode="LI" busLine="IL" context="" id="2013-01-25-15.10.11.785293" network="FBB" subNetwork="Z">
  <deliv id="2013-01-25-15.10.11.785295" mode="1" role="">
     <comm id="2013-01-25-15.10.11.785297" role="">
        <group id="001">
           <doc id="950955269" nbPages="1" templateId="LVMED1" />
        </group>
        <group id="002">
           <doc id="950955270" nbPages="6" templateId="BALVANW_FA" />
        </group>
        <group id="003">
           <doc id="950955271" nbPages="" templateId="LVMED23" />
        </group>
     </comm>
  </deliv>
</distrib>
<distrib appCode="LI" busLine="IL" context="" id="2013-01-25-15.18.29.871466" network="FBB" subNetwork="Z">
  <deliv id="2013-01-25-15.18.29.871468" mode="1" role="">
     <comm id="2013-01-25-15.18.29.871469" role="">
        <group id="001">
           <doc id="950955331" nbPages="2" templateId="LVMED10" />
        </group>
     </comm>
  </deliv>
</distrib>
</report>

要素 'doc' の属性 nbPages のコンテンツを合計したい

これが私が使用するxsltです:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text" />

<xsl:template match="report">
  <xsl:value-of select="count(//doc)"/>
  <xsl:value-of select="sum(//doc[@nbPages])"/>
</xsl:template>

</xsl:stylesheet>

カウントはうまくいきますが、合計はうまくいきません。

[Saxon-PE 9.3.0.5] 文字列 {} を double に変換できない

次の代替手段を使用してみましたが、成功しませんでした。

<xsl:value-of select="sum(number(//doc[@nbPages]))"/>
<xsl:value-of select="sum(//doc[number(@nbPages)])"/>

これについて何か助けていただければ幸いです。

4

3 に答える 3

3

使用:

sum(//doc/@nbPages[number(.) = number(.)])

完全な変換は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:value-of select="sum(//doc/@nbPages[number(.) = number(.)])"/>
 </xsl:template>
</xsl:stylesheet>

正しい結果を生成する

9
于 2013-02-03T17:27:04.963 に答える
2

XPATHがsum関数に対して間違っています。

以来

//doc[@nbPages]:このXPathは、nbPages属性の値ではなく、ノードを返します。

このようにしてください:-

//doc[not(@nbPages) or @nbPages!='']/@nbPages:このXPathは、nbPages属性が存在し、空ではないことを確認します。

sum(//doc[not(@nbPages) or @nbPages!='']/@nbPages)

<xsl:value-of select="sum(//doc[not(@nbPages) or @nbPages!='']/@nbPages)"/>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text"/>
    <xsl:template match="report">
        <xsl:value-of select="count(//doc)"/>
        <xsl:value-of select="sum(//doc[not(@nbPages) or @nbPages!='']/@nbPages)"/>
    </xsl:template>
</xsl:stylesheet>
于 2013-02-01T15:05:42.943 に答える
0

次のような xpath 式を使用します。

<xsl:value-of select="sum(//doc/@nbPages)"/>

同じ問題がここにあります: xsl summation

于 2013-02-01T15:13:13.723 に答える