我有一个输入xml:
<ResultSet1>
<set uid="80301707"/>
<set uid="80301703"/>
<set uid="80301705"/>
</ResultSet1>
<ResultSet2>
<set itemNumber="80301707">
<item>item2</item>
</set>
<set itemNumber="80301703">
<item>item2</item>
</set>
</ResultSet2>
我需要将for-each
/ResultSet1/set@uid
与for-each
/ResultSet2/set@itemNumber
进行比较。如果找到匹配,那么我需要选择/ResultSet2/set/item
答案 0 :(得分:3)
以下是完整的推送式解决方案(未使用<xsl:for-each>
):
<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="ResultSet2/set[@itemNumber = /*/ResultSet1/set/@uid]">
<xsl:copy-of select="*"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<root>
<ResultSet1>
<set uid="80301707"/>
<set uid="80301703"/>
<set uid="80301705"/>
</ResultSet1>
<ResultSet2>
<set itemNumber="80301707">
<item>item1</item>
</set>
<set itemNumber="80301703">
<item>item2</item>
</set>
<set itemNumber="80301704">
<item>item3</item>
</set>
</ResultSet2>
</root>
产生了想要的正确结果:
<item>item1</item>
<item>item2</item>
答案 1 :(得分:1)
如果你的意思是找到匹配,其中set1中的节点与set2中的节点匹配,那么它将内置到XPath中。 (CFR)。 http://www.w3.org/TR/xpath/#booleans
<xsl:for-each select="/ResultSet2/set/item[../@itemNumber = /ResultSet1/set/@uid]">
...
</xsl:for-each>
我还没有测试过。
答案 2 :(得分:1)
假设输入XML的<root/>
节点:)
<root>
<ResultSet1>
<set uid="80301707"/>
<set uid="80301703"/>
<set uid="80301705"/>
</ResultSet1>
<ResultSet2>
<set itemNumber="80301707">
<item>item1</item>
</set>
<set itemNumber="80301703">
<item>item2</item>
</set>
<set itemNumber="80301704">
<item>item3</item>
</set>
</ResultSet2>
</root>
XSLT代码:
<xsl:template match="/root">
<xsl:for-each select="ResultSet1">
<xsl:for-each select="../ResultSet2/set[@itemNumber=//set/@uid]/item">
<!--Do whatever you wish :) -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
对于当前的XSL代码:这将是输出:
<item>item1</item>
<item>item2</item>
希望它有所帮助:) lemme知道是否有任何疑问