Как сравнить два элемента XML из цикла xsl: for с помощью XPath - PullRequest
0 голосов
/ 20 марта 2012

У меня следующая проблема:

В документе таблицы стилей я хочу создать вывод из релятивно простого XML-файла.В то время как большинство общих вещей XPath и XSLT не так уж сложно, сравнивая два элемента и решая, как поступить, сейчас довольно сложно.

пример xml:

<root>
    <foo>
        <value>1</value>
        <name>foo1</name>
    </foo>
    <foo>
        <value>2</value>
        <name></name>
    </foo>
    <foo>
        <value>3</value>
        <name>foo3</name>
    </foo>

    <bar>
        <value>1</value>
    </bar>
    <bar>
        <value>2</value>
    </bar>
</root>

в таблице стилей представляет собой цикл xsl: for, который пытается решить, должен ли отображаться текущий узел:

[...]
<xsl:for-each select="bar">
    <xsl:if test="//foo[value=./value]/name">
        <!-- go on, if the content of the 'name' element is not empty -->
    </xsl:if>
</xsl:for-each>
[...]

Намерение состояло только в том, чтобы продолжить, если содержимое элемента 'name' из 'foo' не пусто, используя euqality элемента 'value'.В результате каждая строка из 'bar' создает вывод, событие, если я намеревался не иметь его для второй записи, поскольку '// foo [2] / name' пусто.

I 'Я не уверен, как действовать в данный момент ... Может быть, сгенерированного ключа будет достаточно !?Я не знаю ...

Спасибо за каждый комментарий!

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Возможно, вы захотите использовать что-то вроде следующего:

<xsl:template match="/">
    <root>
        <xsl:for-each select="//bar">
            <xsl:for-each select="//foo[value=current()/value]">
                <xsl:if test="name != ''">
                    <xsl:copy-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </root>
</xsl:template>

Самое поразительное, конечно, что вы должны использовать current () / value вместо ./value, потому что current () относится к строкеэлемент и.относится к элементу foo, зацикленному поверх.

При применении к входу, полученному, это дает

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <foo>
        <value>1</value>
        <name>foo1</name>
    </foo>
</root>
1 голос
/ 20 марта 2012

Используйте ключ, например.

<xsl:key name="k1" match="foo" use="value"/>

как ребенок xsl:stylesheet, а затем

<xsl:for-each select="bar[normalize-space(key('k1', value)/name)]">...</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...