XSLT:如何比较for-each循环中不同节点的属性

时间:2018-05-29 04:44:43

标签: xml xslt xpath xslt-1.0 xslt-2.0

我有一些问题要比较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。

2 个答案:

答案 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"/>