<xsl:for-each select="/dsInventory/Room">
<xsl:for-each select="/dsInventory/Method">
<xsl:if test="RoomId=../RoomId"></xsl:if>
</xsl:for-each>
</xsl:for-each>
この質問に答えた人々が指摘したように、あなたは a と a を比較しようとしていますが/dsInventory/Method/RoomId
、/dsInventory/RoomId
後者は提供された XML ドキュメントには存在しません。
roomid に基づいて、対応する部屋のメソッドを選択しようとしています。
これを行う方法を示す完全な変換を次に示します。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Room">
<xsl:copy>
<xsl:apply-templates/>
<xsl:apply-templates mode="grab"
select="/*/Method[RoomId = current()/RoomId]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Method" mode="grab">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="Method | Method/RoomId"/>
</xsl:stylesheet>
この変換が次の XML ドキュメント(メソッド名が変更された提供されたもの -- 互いに異なるもの) に適用される場合:
<dsInventory>
<Room>
<RoomName>kantoor 1</RoomName>
<RoomId>1376257</RoomId>
</Room>
<Room>
<RoomName>Hal</RoomName>
<RoomId>1376258</RoomId>
</Room>
<Method>
<RoomId>1376257</RoomId>
<Name>test1</Name>
</Method>
<Method>
<RoomId>1376258</RoomId>
<Name>test2</Name>
</Method>
</dsInventory>
必要な正しい結果が生成されます (メソッドがルームに追加されMethod
、最上位要素の子が削除されます)。
<dsInventory>
<Room>
<RoomName>kantoor 1</RoomName>
<RoomId>1376257</RoomId>
<Method>
<Name>test1</Name>
</Method>
</Room>
<Room>
<RoomName>Hal</RoomName>
<RoomId>1376258</RoomId>
<Method>
<Name>test2</Name>
</Method>
</Room>
</dsInventory>
説明:
アイデンティティ ルールは、実行対象として選択されたすべてのノードを「そのまま」コピーします。
ID テンプレートをオーバーライドするテンプレートは、 に一致しRoom
ます。ここで、Room
要素は「浅いコピーされ、テンプレートがその子に適用されます (これにより、それらのアイデンティティ テンプレートが選択され、それらは「そのまま」出力にコピーされます)。次に、子が同じ値を持つ任意Method
の にRoomId
テンプレートが適用されます。RoomId
現在一致している ( current()
)要素の子としてRoom
. 後で任意のMethod
要素を削除したいので、ここでは必要な処理 (削除とは異なります) を"grab"
モードで実行することを指定します.
ID テンプレートをオーバーライドする 2 番目のテンプレートは、すべてのMethod
要素を一致させ、本文を空にするだけで、すべての要素を削除します。
Method
in モードに一致するテンプレートは、"grab"
単純にそれを浅くコピーし、テンプレートをその子に適用します。その子のうち、Name
は ID テンプレートによってのみ照合され、「そのまま」コピーされます。子はRoomId
ID テンプレートよりも具体的なテンプレートによって照合され、前者が実行用に選択されます。選択されたテンプレートには本文がなく、一致したものが出力から効果的に「削除」Method/RoomId
されます。