<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/dsInventory/Method/RoomId
与 a进行比较/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>
说明:
身份规则“按原样”复制选择执行它的每个节点。
覆盖身份模板的模板匹配Room
. 这里Room
元素是“浅拷贝,模板应用于其子元素(为它们选择标识模板,并将它们“按原样”复制到输出),然后将模板应用于 any Method
,其RoomId
子元素具有相同的值作为RoomId
当前匹配current()
(Room
_ Method
_"grab"
覆盖标识模板的第二个模板Method
通过简单地匹配它们并具有空主体来删除所有元素。
匹配Method
in 模式的模板"grab"
只是简单地对其进行浅拷贝并将模板应用于其子项。在其子项中,Name
仅由标识模板匹配并“按原样”复制。RoomId
子项由比身份模板更具体的模板匹配,并选择前者执行。所选模板没有正文,这有效地Method/RoomId
从输出中“删除”了匹配项。