Как проверить все поля listnode относительно определенного значения в xslt? - PullRequest
0 голосов
/ 05 ноября 2019

https://xsltfiddle.liberty -development.net / 94AbWB6 / 2

В этом примере я пытаюсь сопоставить список <persons>, чей <person>.<lastname> не соответствует всем другим лицам внутриэтот список.

<root>
    <persons>
        <person>
            <lastname>doe</lastname>
        </person>    
        <person>
            <lastname>done</lastname>
        </person>    
    </persons>
    <persons>
        <person>
            <lastname>name</lastname>
        </person>    
        <person>
            <lastname>name</lastname>
        </person>    
    </persons>
</root>

Во втором списке <lastname>name</lastname> всегда равен. Но в 1-м списке фамилия отличается. Так что я ожидаю, что следующий xslt выдаст doe. Но это не так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

    <xsl:template match="/root">
        <xsl:for-each select="persons">
            <xsl:variable name="lastname" select="person[1]/lastname"/>
            <xsl:if test="not(person/lastname = $lastname)">
                <xsl:text>lastnames should be the same: </xsl:text>
                <xsl:value-of select="$lastname"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

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

Таким образом, вопрос можно перефразировать так: как извлечь все <lastname> как Set и проверьте, если set.size != 1?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Похоже, count(distinct-values(person/lastname)) = 1 выражает ваше состояние в перефразировке.

1 голос
/ 05 ноября 2019

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

Вы можете выполнить простую проверку неравенства (из контекста persons):

<xsl:if test="person/lastname != person/lastname">

Это вернет true, если у любого person есть lastname, отличный от любого из его братьев и сестер: https://xsltfiddle.liberty -development.net / 94AbWB6 / 5

...