2009-07-21 8 views
0

XML:XSLT和

<Budget> 
    <Table1> 
     <AllocID>1</AllocID> 
     <Amount>1000</Amount> 
    </Table1> 
    <Table1> 
     <AllocID>2</AllocID> 
     <Amount>2000</Amount> 
    </Table1> 
    <Table1> 
     <AllocID>3</AllocID> 
     <Amount>3000</Amount> 
    </Table1> 
    <Table2> 
     <AllocID>1</AllocID> 
     <Split>100</Split> 
    </Table2> 
    <Table2> 
     <AllocID>2</AllocID> 
     <Split>100</Split> 
    </Table2> 
</Budget> 

私は、テーブル内の金額を表示していますが、「スプリット」値は表2に存在する場合にのみ。

<xsl:for-each select="Budget/Table1"> 
    <xsl:for-each select="//Budget/Table2[AllocID = current()/AllocID]"> 
     <xsl:value-of select="Amount"/> 
    </xsl:for-each> 
</xsl:for-each> 
//Total for the records here. 

私は表1からの金額の合計を取得する必要がありますが、AllocIDの値は表2に存在する場合にのみ。したがって、この例では、AllocIDの金額の合計が1になるだけです。& 2.与えられたデータセットを変更せずにxsltでどのようにしますか?入力データについて他に何も知らない

答えて

2

(私はあなたが実際のXMLを使用しないを選んだ理由はわかりません)、私は少しを推測するためにする必要がありますするつもりです:

<Budget> 
    <Table1> 
    <AllocID>1000</AllocID> 
    <AllocID>2000</AllocID> 
    <AllocID>3000</AllocID> 
    </Table1> 
    <Table2> 
    <AllocID>1000</AllocID> 
    <AllocID>2000</AllocID> 
    </Table2> 
</Budget> 

最も簡単です

<!-- this will return 3000 for the above input --> 
<xsl:template match="/" > 
    <xsl:value-of select=" 
    sum(Budget/Table1/AllocID[. = //Budget/Table2/AllocID]) 
    " /> 
</xsl:template> 

実行和はまた、再帰関数を計算することができ、このような:

右XPath式とともにXPath sum() function
<!-- this will also return 3000 for the above input --> 
<xsl:template match="/" > 
    <xsl:call-template name="total"> 
    <xsl:with-param name="nodes" select=" 
     Budget/Table1/AllocID[. = //Budget/Table2/AllocID] 
    " /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="total"> 
    <xsl:param name="nodes" /> 

    <xsl:choose> 
    <!-- either there is something to calculate... --> 
    <xsl:when test="string(number($nodes[1])) != 'NaN'"> 
     <xsl:variable name="subtotal"> 
     <xsl:call-template name="total"> 
      <xsl:with-param name="nodes" select="$nodes[position() &gt; 1]" /> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:value-of select="number($nodes[1]) + $subtotal" /> 
    </xsl:when> 
    <!-- ...or we assume 0 --> 
    <xsl:otherwise> 
     <xsl:value-of select="0" /> 
    </xsl:otherwise> 
    </xsl:choose> 

</xsl:template> 

これは遅くなりますが、計算プロセスの柔軟性が向上します。たとえば、すべての非数値の値を0で置き換えることができます。または、独自のルールに従って、指定されたノードの異なる値を使用します。

+0

ご意見ありがとうございます。最初のものを少し変更して使用することができました。つまり、予算(Budget/Table1 [./AllocID = // Budget/Table2/AllocID]/Amount)です。また将来の読者のためにxmlで質問を更新しました。 – tessa

+0

ありがとうございました - – Andez

+0

私が追加しなければならなかったことの1つは、 037のチェックでした。 – Andez