前の質問に続いて' xslt:中間参照ノードを介して一意のノードを選択しますか?'。
とにかく、複数のxmlドキュメントを参照する「キー」を使用することはできますか?
何かのようなもの:
<xsl:key name="ChildByFIdAndMFId"
match="collection('file:///c:/temp/xslt?select=test*.xml')Child"
use="concat(FathersID, '+', MothersFatherID)"/>
「パターンの先頭での収集機能は許可されていません」というエラーが発生します。複数のドキュメントでFathersIDとMothersFatherIDによって一致するすべての「子」ノードを参照して、合計やカウントなどの統計結果を取得しようとしています。キーステートメントでコレクションを使用できることは良い候補のように見えましたが、構文が間違っているか、それがまったく不可能である可能性がありますか?
詳細に(以前のxmlとコードに基づいて)...
XMLファイルは次のようになります。
<t>
<Children>
<Child>
<ID>1</ID>
<FathersID>100</FathersID>
<MothersFatherID>200</MothersFatherID>
<Total>2</Total>
</Child>
<Child>
<ID>2</ID>
<FathersID>100</FathersID>
<MothersFatherID>201</MothersFatherID>
<Total>3</Total>
</Child>
<Child>
<ID>3</ID>
<FathersID>100</FathersID>
<MothersFatherID>202</MothersFatherID>
<Total>5</Total>
</Child>
<Child>
<ID>4</ID>
<FathersID>100</FathersID>
<MothersFatherID>201</MothersFatherID>
<Total>3</Total>
</Child>
<Child>
<ID>5</ID>
<FathersID>101</FathersID>
<MothersFatherID>201</MothersFatherID>
<Total>4</Total>
</Child>
</Children>
<Fathers>
<Father>
<ID>100</ID>
</Father>
<Father>
<ID>101</ID>
</Father>
</Fathers>
<MothersFathers>
<MothersFather>
<ID>200</ID>
</MothersFather>
<MothersFather>
<ID>201</ID>
</MothersFather>
<MothersFather>
<ID>202</ID>
</MothersFather>
</MothersFathers>
</t>
参照するこれらのファイルは最大30個ある可能性がありますが、現時点では子ノードの照合にのみ関心があります(そのうち、ファイルあたり3000ノードのオーダーである可能性があります)-ファイル間に子ノードが重複している可能性がありますが、統計(合計)は異なります。
これまでのxslt:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kMFByFId" match="MothersFatherID" use="../FathersID"/>
<!--use="../FathersID"/>-->
<xsl:key name="kMFById" match="MothersFather" use="ID"/>
<xsl:key name="ChildByFIdAndMFId" match="Child"
use="concat(FathersID, '+', MothersFatherID)"/>
<xsl:template match="Children|MothersFathers|text()"/>
<xsl:template match="Father">
Father ID=<xsl:value-of select="ID"/>
<xsl:variable name="Fid" select="ID"></xsl:variable>
<xsl:apply-templates select=
"key('kMFById',
key('kMFByFId', ID)
[generate-id(..)
=
generate-id(key('ChildByFIdAndMFId',
concat(../FathersID,'+',.)
)[1]
)
]
)">
<xsl:sort select="ID" data-type="text"/>
<xsl:with-param name="Fid" select="$Fid"></xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="MothersFather">
<xsl:param name="Fid"></xsl:param>
<xsl:variable name="FidAndMid" select="concat($Fid,'+',ID)"></xsl:variable>
MothersFather ID=<xsl:value-of select="ID"/>
Sum of Total= <xsl:value-of
select="sum(key('ChildByFIdAndMFId', $FidAndMid)/Total)"/>
</xsl:template>
</xsl:stylesheet>
したがって、これは単一のxmlドキュメントで機能します-上記のxmlは次のようになります。
Father ID=100
MothersFather ID=200
Sum of Total= 2
MothersFather ID=201
Sum of Total= 6
MothersFather ID=202
Sum of Total= 5
Father ID=101
MothersFather ID=201
Sum of Total= 4
しかし、キーでコレクションを使用できない場合、現在のFatherIDとMothersFatherIDの子ノードに一致する他のすべてのドキュメントを参照するにはどうすればよいですか?
たとえば、上記のxmlが、データをプルする必要があるさらに2つのファイルにそのまま複製された場合、出力には次のような新しい合計の合計が含まれます。
Father ID=100
MothersFather ID=200
Sum of Total= 6
MothersFather ID=201
Sum of Total= 18
MothersFather ID=202
Sum of Total= 15
Father ID=101
MothersFather ID=201
Sum of Total= 12
すべてのファイルを簡単に取り込むことができるように「コレクション」を使用したいのはわかりますが、どこでどのように行うのかわかりません。誰か助けてくれませんか?