2

前の質問に続いて' 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

すべてのファイルを簡単に取り込むことができるように「コレクション」を使用したいのはわかりますが、どこでどのように行うのかわかりません。誰か助けてくれませんか?

4

1 に答える 1

4

Dimitre が言うように、key()検索するドキュメントは 1 つだけです。ドキュメントのセットを検索したい場合、それは簡単です: $s/key(...)$s がドキュメントのセットを保持する場所を使用します。ドキュメントのセットは、collection() 関数の呼び出し、一連の URI を提供する document() の呼び出し、または doc() への多数の呼び出しの結果を結合することによって取得できますfor $x in $uri-list return doc($x)

于 2013-02-08T08:10:23.057 に答える