我有一些问题要比较for-each循环中两个不同节点的两个不同属性。
鉴于此XML:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<cars>
<car id="1" color="blue" misc="4"/>
<car id="2" color="red" misc="3"/>
<car id="3" color="blue" misc="2"/>
<car id="n" color="black" misc="1"/>
</cars>
<bikes>
<bike id="1"/>
<bike id="2"/>
<bike id="3"/>
<bike id="n"/>
</bikes>
</test>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>TEST - </h2>
<xsl:variable name="bikes" select="test/bikes/bike"/>
<xsl:variable name="cars" select="test/cars/car"/>
<xsl:for-each select="$bikes">
<xsl:variable name="bikesID" select="./@id"/>
<xsl:for-each select="$cars">
<xsl:if test="$bikesID = ./@id">
<xsl:if test="./@color = 'blue'">
<xsl:value-of select="./@misc"/>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我想比较自行车和汽车的ID,如果它们相等,那么请使用其他汽车的属性进行简单检查..请参阅下面的预期结果。
TEST - 4 2
非常感谢任何帮助。
干杯
P.S。:由于缺乏关注,真正的问题是错误的命名空间。该 代码实际上工作正常,即使看起来不那么好 通过使用XPath / XSLT 2.0。
答案 0 :(得分:0)
您不需要汽车内循环,只需用XPath表达式替换它就可以直接选择匹配的misc
属性:
<xsl:for-each select="test/bikes/bike">
<xsl:variable name="id" select="@id"/>
<xsl:value-of select="/test/cars/car[@id = $id and @color = 'blue']/@misc"/>
</xsl:for-each>
答案 1 :(得分:0)
我没有看到你的代码有多大的错误,但是在XSLT 2.0中如果你想要一些不那么冗长的东西你可以写
<xsl:value-of select="for $bike in test/bikes/bike
return test/cars/car[@id=$bike/@id]/@color"/>