XSLT: как сравнить атрибуты разных узлов в цикле for-each - PullRequest
0 голосов
/ 29 мая 2018

У меня возникли некоторые проблемы при сравнении двух разных атрибутов двух разных узлов в цикле 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>

Я хочу сравнить идентификатор мотоцикла и автомобиля, если они равны, а затем сделать простую проверку с атрибутом другого автомобиля. Пожалуйста, посмотрите ожидаемый результат ниже.

ТЕСТ - 4 2

Любая помощь очень ценится.

Приветствия

PS: Реальная проблема заключалась в неправильном пространстве имен из-за недостатка внимания.Код на самом деле работает нормально, даже если выглядит не так хорошо, как можно было бы использовать XPath / XSLT 2.0.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Я не вижу ничего плохого в вашем коде, но в XSLT 2.0, если вы хотите что-то менее подробное, вы можете написать

<xsl:value-of select="for $bike in test/bikes/bike 
                      return test/cars/car[@id=$bike/@id]/@color"/>
0 голосов
/ 29 мая 2018

Вам не нужен внутренний цикл для автомобилей, и вы можете просто заменить его выражением 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>
...