Проверка всех значений в элементе одинаковы - PullRequest
9 голосов
/ 14 декабря 2011

У меня есть xml как, значения могут быть

<n1>value1</n1>
<n1>value1</n1>
<n1>value2</n1>

Мне нужно проверить, все ли значения одинаковы, и если они одинаковые, мне нужно присвоить их другому элементу Я использую XSLT v1.0.

Спасибо

Ответы [ 2 ]

12 голосов
/ 15 декабря 2011

Хороший вопрос, + 1.

Просто используйте :

not(/*/n1[1] != /*/n1)

Предполагая, что все n1 элементы выбраны в переменной с именем $v, , это может быть выражено в виде XPath-выражения длиной всего 14 символов :

not($v[1] != $v)

Объяснение 1 :

По определению:

/*/n1[1] != /*/n1

равен true() точно, если в /*/n1 существует узел, строковое значение которого не равно строковому значению /*/n1[1]

Логическое отрицание этого:

not(/*/n1[1] != /*/n1)

is true() если no узел в /*/n1 существует, строковое значение которого не равно строковому значению /*/n1[1] - то есть, если все узлы в /*/n1 имеют то же самое жало.

Объяснение 2 :

Это следует из более общего закона двойного отрицания :

every x has property y

эквивалентно:

There is no x that doesn't have property y
0 голосов
/ 14 декабря 2011

Предположим, документ этой формы:

<root>
    <n1>value1</n1>
    <n1>value1</n1>
    <n1>value1</n1>
</root>

Следующая простая таблица стилей определяет, имеет ли каждый элемент n1 одинаковое значение:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <xsl:value-of select="
            concat('All same? ', count(/*/n1[.=/*/n1[1]])=count(/*/n1))"/>
    </xsl:template>
</xsl:stylesheet>

Вывод:

All same? true

Ключом к этой таблице стилей является выражение:

count(/*/n1[.=/*/n1[1]])=count(/*/n1))

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

Это можно сделать немного проще для чтения, сначала выделив все n1 в переменную с именем n:

count($n[.=$n[1]])=count($n)

Условно выполните некоторые действия, основанные на результате, подобном следующему:

<xsl:template match="/">
    <xsl:variable name="all" select="count(/*/n1[.=/*/n1[1]])=count(/*/n1)"/>
    <xsl:if test="$all">All same</xsl:if>
    <xsl:if test="not($all)">Not all same</xsl:if>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...