Как утверждать, что все дочерние узлы имеют определенное значение атрибута в XPath? - PullRequest
0 голосов
/ 16 июля 2009

С учетом следующего частичного XML-документа:

<section>
    <entry typeCode="DRIV">
        <act classCode="AT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>
    <entry typeCode="DRIV">
        <act classCode="ACT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>
    <entry typeCode="DRIV">
        <act classCode="ACT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>
    <entry typeCode="DRIV">
        <act classCode="ACT" moodCode="DEF">
            <statusCode code="completed"/>
        </act>
    </entry>

    <section>
        <entry typeCode="DRIV">
            <act classCode="AT" moodCode="DEF">
                <statusCode code="completed"/>
            </act>
        </entry>
        <entry typeCode="DRIV">
            <act classCode="ACT" moodCode="DEF">
                <statusCode code="completed"/>
            </act>
        </entry>
    </section>
</section>

Я хочу заявить, что все элементы, которые являются потомками внешнего элемента <section>, но не внутреннего элемента <section>, имеют для атрибута classCode значение "ACT".

Другими словами, учитывая приведенный выше пример, мне не нужно утверждать значение двух <act> потомков во втором <section> элементе. Также может быть один или несколько вложенных <entry> элементов (не максимум).

Я попробовал следующее выражение XPath,

<xsl:when test="cda:section/cda:entry/cda:act//@classCode='ACT'"/>

Если какой-либо из элементов <act> имеет значение для атрибута classCode, отличное от "ACT", утверждение должно завершиться неудачей. Я ищу совет о том, как изменить выражение XPath, чтобы оно соответствовало этому требованию.

Ответы [ 4 ]

4 голосов
/ 16 июля 2009

Вы просто инвертируете условие:

<xsl:when test="not(cda:section/cda:entry/cda:act//@classCode != 'ACT')"/>

Выражение внутри not() будет производить true, если any @classCode не будет равно 'ACT'. Он вернет false, только если no @classCode равно 'ACT'. И затем мы также инвертируем это и получаем желаемый эффект.

1 голос
/ 16 июля 2009

Предполагая, что контекстный узел является непосредственным родителем внешнего <section>, вы можете сделать это с помощью следующего теста:

<xsl:when test="count(cda:section/cda:entry/cda:act) = count(cda:section/cda:entry/cda:act[@classCode = 'ACT'])">
    <foo/>
</xsl:when>

Это работает путем подсчета количества <act> элементов, принадлежащих <entry> s, которые являются прямыми потомками <section> (что-либо в дочернем элементе <section> пропускается). Затем он подсчитывает количество <act> с, которые имеют classCode, равное "ACT", и определяет, совпадают ли эти два значения. Поскольку узел не может соответствовать второму счету, но не первому, вы знаете, что все не вложенные потомки <act> s имеют правильные classCode.

0 голосов
/ 16 июля 2009

Если какой-либо из элементов <act> имеет значение для атрибута classCode кроме "ACT", утверждение должен потерпеть неудачу.

Еще один вариант, который может быть семантически более очевидным:

count(cda:section/cda:entry/cda:act[@classCode != 'ACT']) = 0
0 голосов
/ 16 июля 2009

Hm.

<xsl:when test="cda:section/cda:entry/cda:act/@classcode = 'ACT'" /> 

Должен делать то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...