считать элементы XML с несколькими условиями - PullRequest
4 голосов
/ 08 февраля 2012

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

<setting>
    <type>house</type>
    <context>roof</context>
    <value>blue</value>
</setting>
<setting>
    <type>house</type>
    <context>kitchen</context>
    <value>red</value>
</setting>
<setting>
    <type>house</type>
    <context>floor</context>
    <value>black</value>
</setting>
<setting>
    <type>apartment</type>
    <context>roof</context>
    <value>red</value>
</setting>

Я хочу подсчитать, имеет ли параметр-> тип «квартира» «контекст-> этаж».

Я пытался сделать это с:

<xsl:if test="count(setting[type='apartment'] and setting[context='floor']) &lt; 1">
    <!-- do what ever !-->
</xsl:if>

, но, похоже, это не работает.Я получаю исключение при попытке превратить число в логическое значение?Любые предложения?

обновление: я понял, что я мог бы использовать:

<xsl:if test="count(setting[type='apartment' and context='floor']) &lt; 1">

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Оператор в count возвращает неправильное логическое значение.count () требует набора узлов, чтобы иметь возможность считать узлы.Если это тот же элемент настройки, который должен иметь элементы type и appartment с необходимыми значениями, вы, вероятно, смотрите:

count(setting[type='apartment' and context='floor']) &lt; 1

В противном случае, если вам нужна сумма элементов настройки, которые имеют type = apartment или context= этаж (исключая настройку счета, в которой оба элемента имеют требуемые значения), вам, вероятно, понадобится:

count(setting[type='apartment'] | setting[context='floor']) &lt; 1
0 голосов
/ 08 февраля 2012

Как насчет использования каскадных предикатов, например, так:

count(setting[type='apartment'][context='floor']) &lt; 1
...