Ключевой оператор XSLT возвращает группу, и я не могу отделить результат - PullRequest
0 голосов
/ 26 марта 2020

У меня проблема, и мне нужна ваша помощь в следующем XML примере.

<A>
<B Name="Alpha"> 
    <C>
        <D>
            <E Nr="1" Wert="A"/>
            <E Nr="2" Wert="B"/>
            <E Nr="3" Wert="C"/>
            <E Nr="4" Wert="D"/>
        </D>
        <F Name="Fo" E_Nr="3"/>
    </C>
</B>
<B Name="Beta">
    <C>
        <D>
            <E Nr="1" Wert="E"/>
            <E Nr="2" Wert="F"/>
            <E Nr="3" Wert="G"/>
            <E Nr="4" Wert="H"/>
        </D>
        <F Name="Bar" E_Nr="2"/>
    </C>
</B>

Результатом после преобразования должен быть следующий текст.

Fo C
Bar F

В моем XSLT я использую оператор ключа, но я получаю более одного результата для ключевой ссылки.

<xsl:key name="test" match="//E" use="@Nr"/>

Чтобы отличить guish поддеревьев, которые я хочу использовать атрибут от B . Итак, мой результат:

Fo C
Bar C

Но я думаю, что необходимо использовать ключ, потому что в D может быть внутри тысячи E узлов.

Можно ли эффективно решить эту проблему с помощью XSLT?

Резервуары за вашу помощь!

1 Ответ

0 голосов
/ 26 марта 2020

Чтобы ограничить ключ текущим элементом B, определите его как:

<xsl:key name="e" match="E" use="concat(@Nr, '|', generate-id(ancestor::B))" />

, затем вызовите его из контекста F как:

<xsl:value-of select="key('e', concat(@E_Nr, '|',  generate-id(ancestor::B)))/@Wert"/>

Демо : https://xsltfiddle.liberty-development.net/ehVZvvG

...