0
イベントのリストを含むXMLファイルがあります。各イベントは、実際には、begin
およびend
イベントです。次のXMLを仮定します。私は適用することは、このように見えるものですテンプレート内のノードを再グループ化する
<Events>
<Event id="1" type="begin" date="xxxx"/>
<Event id="2" type="end" date="xxxy"/>
<Event id="3" type="begin" date="xxyx"/>
<Event id="4" type="end" date="xyxx"/>
<Event id="5" type="begin" date="yxxx"/>
<Event id="6" type="end" date="xxyy"/>
</Events>
:
<Events>
<xsl:apply-templates select="//Event"/>
</Events>
<xsl:template match="Event">
<Period>
<Begin>
<Event>
<xsl:attribute name="id" select="[@type='begin']/@id"/>
<xsl:attribute name="date" select="[@type='begin']/@date"/>
</Event>
</Begin>
<End>
<Event>
<xsl:attribute name="id" select="[@type='end']/@id"/>
<xsl:attribute name="date" select="[@type='end']/@date"/>
</Event>
</End>
</Period>
</xsl:template>
は、予想される結果はこのようになります:
<Events>
<Period>
<Begin>
<Event id="1" type="begin" date="xxxx"/>
</Begin>
<End>
<Event id="2" type="end" date="xxxy"/>
</End>
</Period>
<Period>
<Begin>
<Event id="3" type="begin" date="xxyx"/>
</Begin>
<End>
<Event id="4" type="end" date="xyxx"/>
</End>
</Period>
<Period>
<Begin>
<Event id="5" type="begin" date="yxxx"/>
</Begin>
<End>
<Event id="6" type="end" date="xxyy"/>
</End>
</Period>
</Events>
しかし、結果がこれです1:
<Events>
<Period>
<Begin>
<Event id="1" type="begin" date="xxxx"/>
</Begin>
<End>
<Event id="" type="end" date=""/>
</End>
</Period>
<Period>
<Begin>
<Event id="" type="begin" date=""/>
</Begin>
<End>
<Event id="2" type="end" date="xxxy"/>
</End>
</Period>
...
</Events>
私はこの結果を得た理由を理解しています。なぜなら、テンプレートは要素を順番に要素にマッチさせるからですが、「同時に2つのノード」に一致するテンプレートを使用して目標を達成する方法があるかどうかを知りたいですか?私はそれを見てきましたが、私が望む解決策の近くにある唯一のものはMuenchianグループです(上記のような小さなデータセットのセットアップは本当に複雑です)。
テンプレートは '[タイプ@ = '開始']'どのように以下の-兄弟 'end'タイプで来るとイベントと一致した場合は?あなたはすべての 'イベント'と一致してはいけませんか? – Jacks
私は 'Event [@ type = 'end']'の明示的なコピーを選択して実行します。この場合、 'イベント 'を処理するための"マッチ "は必要ありません。さらに、私は変換プロセスでこれらの要素をマッチングさせないようにする必要があります。 – potame
わかりました。あなたの答えをありがとう、私の場合は「兄弟姉妹」が行方不明だったし、それはトリックでした。再びありがとう ! – Jacks