XML - строка, равная одному из атрибутов - PullRequest
4 голосов
/ 06 декабря 2011

Я хочу проверить, есть ли строка, равная одному из атрибутов. Для экземпляров:

<rules>
        <mother cat="pp">
            <daughter cat="pr"/>
            <daughter cat="np"/>
        </mother>
        <mother cat="wp">
            <daughter cat="rp"/>
            <daughter cat="vp"/>
        </mother>
        <mother cat="cn">
            <daughter cat="jj"/>
            <daughter cat="cn"/>
        </mother>
        <mother cat="np">
            <daughter cat="jj"/>
            <daughter cat="np"/>
        </mother>
    </rules>

Мне просто нужно проверить, равен ли "pp" одному из атрибутов кота у мамы. Для этого примера да, это так. Но это должно быть ложным для "пр".

Спасибо.

Ответы [ 4 ]

3 голосов
/ 06 декабря 2011

Используйте следующее выражение:

/*/mother[@cat='pp']

Это выражение возвращает элемент mother, имеющий атрибут с именем cat, значение которого равно pp.

В тестовом выражении xsl:if будет возвращено true, если такой узел существует; ложь, в противном случае. Например:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:if test="/*/mother[@cat='pp']">NODE EXISTS</xsl:if>
    </xsl:template>
</xsl:stylesheet>

Эта таблица стилей печатает NODE EXISTS только тогда, когда такой узел присутствует в источнике.

Найти позицию этого элемента, используя следующее выражение:

count(/*/mother[@cat='pp']/preceding-sibling::*)+1
1 голос
/ 06 декабря 2011

Это:

<xsl:if test="//mother[@cat = 'pp']">
  <xsl:message terminate="no">
    Exists!
  </xsl:message>
</xsl:if>

Будет печатать Exists! Если есть хотя бы одна мать с @cat = 'pp'.

1 голос
/ 06 декабря 2011

Этот синтаксис XPath будет работать для вашего случая ...

//mother[@cat='pp']

Он вернет все узлы mother, которые имеют значение "pp" в атрибуте cat. В противном случае, если вы тестировали

//mother[@cat='pr']

Тогда вы вернете пустой узел.

0 голосов
/ 06 декабря 2011

Мне просто нужно проверить, равен ли "pp" коту матери атрибут.

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

Проще, чем все остальные имеющиеся ответы :

/*/mother/@cat = 'pp'

Это оценивается как true() точно в том случае, когда "pp" равно строковому значению атрибута cat элемента mother, который является дочерним элементом верхнего элемента XML-документа.

Для этого примера да, это так. Но это должно быть ложным для "пр".

Еще раз, оцените :

/*/mother/@cat = 'pr'

Ниже приведено простое преобразование, показывающее это в действии :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  /*/mother/@cat = 'pp' is <xsl:text/>
  <xsl:value-of select="/*/mother/@cat = 'pp'"/>

  /*/mother/@cat = 'pr' is <xsl:text/>
  <xsl:value-of select="/*/mother/@cat = 'pr'"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<rules>
    <mother cat="pp">
        <daughter cat="pr"/>
        <daughter cat="np"/>
    </mother>
    <mother cat="wp">
        <daughter cat="rp"/>
        <daughter cat="vp"/>
    </mother>
    <mother cat="cn">
        <daughter cat="jj"/>
        <daughter cat="cn"/>
    </mother>
    <mother cat="np">
        <daughter cat="jj"/>
        <daughter cat="np"/>
    </mother>
</rules>

желаемый, правильный результат выдается :

  /*/mother/@cat = 'pp' is true

  /*/mother/@cat = 'pr' is false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...