0

xsltでmuenchian-groupingを実行しているときに、キーがどのように生成されるかについては、まだ答えが見つかりません。私が見つけた例はすべて、非常に単純なxmlファイルを持っています。次のxmlファイルがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<despatch-advice>
<message-id>2012041715435517181</message-id>
<message-creation>2012-04-17T15:43:55.000+02:00</message-creation>
<originatingFlow>DespatchAdvice</originatingFlow>
<shipment>
    <transport-mode>Sea</transport-mode>
    <transport-id>1111</transport-id>
    <order-line>
        <order>123</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>ME</selling-code>
    </order-line>
</shipment>
<shipment>
    <transport-mode>Sea</transport-mode>
    <transport-id>2222</transport-id>
    <order-line>
        <order>456</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>ME</selling-code>
    </order-line>
    <order-line>
        <order>789</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>ME</selling-code>
    </order-line>
    <order-line>
        <order>832</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>XM</selling-code>
    </order-line>
</shipment>
<shipment>
    <transport-mode>Air</transport-mode>
    <transport-id>333</transport-id>
    <order-line>
        <order>781</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>XM</selling-code>
    </order-line>
    <order-line>
        <order>789</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>XM</selling-code>
    </order-line>
</shipment>

私がやりたいのは、各出荷の販売コードごとに注文明細をグループ化することです。

xsltファイルで、キーを次のように定義します。

<xsl:key name="groups" match="order-line" use="selling-code"/>

そして、xmlファイルの最初の部分を作成した後、次のようにします。

<xsl:for-each select="order-line[generate-id(.)=generate-id(key('groups',selling-code)[1])]"> 
<ns0:order-line-group>                                      
<xsl:for-each select="key('groups',selling-code)">
<ns0:order-line>

<shipmentxmlファイルは現在のノードから解析され、構築されたキー<order-lineはその特定の出荷に対してのみノードを使用することを期待します。しかし、代わりに、ファイル内の<shipmentすべてのノードを含む3つのノードを取得<order-lineします。それで、キーが作成されるとき、xmlファイルは常にルートから解析されるように見えますか?そうですか?これを回避する方法はありますか?

4

1 に答える 1

4

次のようなキーを定義する必要があります

<xsl:key name="groups" match="order-line" use="concat(generate-id(..), '|', selling-code)"/>

そして、あなたは使用する必要があります

<xsl:for-each select="order-line[generate-id(.)=generate-id(key('groups',concat(generate-id(..), '|', selling-code))[1])]"> 
<ns0:order-line-group>                                      
<xsl:for-each select="key('groups',concat(generate-id(..), '|', selling-code))">
<ns0:order-line>

出荷ごとにアイテムのみを処理するようにします。

XSLT 2.0では、key関数にはサブツリー内のアイテムを検索するための3番目の引数がありますが、XSLT 1.0にはそれがないため、検索を制限するノードのIDをキー値に入れる必要があります。そしてもちろん、XSLT 2.0にはfor-each-group、グループ化のためにキーはまったく必要ありません。

于 2012-05-09T13:09:29.237 に答える