XPath 1 запрос и имя атрибута - PullRequest
8 голосов
/ 29 марта 2009

Первый вопрос: есть ли способ получить имя атрибутов узла?

<node attribute1="value1" attribute2="value2" />

Второй вопрос: есть ли способ получить атрибуты и значения в виде пар значений? Ситуация следующая:

<node attribute1="10" attribute2="0" />

Я хочу получить все атрибуты, где значение> 0 и таким образом: "attribute1 = 10".

Ответы [ 3 ]

12 голосов
/ 29 марта 2009

Первый вопрос: есть ли способ получить имя атрибута узла?

<node attribute1="value1" attribute2="value2" />

Да: Это выражение XPath (когда node является узлом контекста (текущего)):

name(@*[1])

создает имя первого атрибута (порядок может зависеть от реализации)

и это выражение XPath (когда node является узлом контекста (текущего)):

name(@*[2])

создает имя второго атрибута (порядок может зависеть от реализации).

Второй вопрос: есть ли способ получить атрибуты и значения как пары значений? Ситуация следующая:

<node attribute1="10" attribute2="0" />

Я хочу получить все атрибуты, где значение> 0 и так: "attribute1 = 10".

Это XPath-выражение (когда атрибут с именем "attribute1" является контекстным (текущим) узлом)):

concat(name(), '=', .)

выдает строку:

attribute1=value1

и это выражение XPath (когда узел node является узлом контекста (текущего)):

@*[. > 0]

выбирает все атрибуты узла контекста, значение которого является числом больше 0.

В XPath 2.0 их можно объединить в одном выражении XPath :

@*[number(.) > 0]/concat(name(.),'=',.)

чтобы получить (в данном конкретном случае) этот результат:

attribute1=10

Если вы используете XPath 1.0 , который является менее мощным, вам потребуется встроить выражение XPath в язык хостинга, например XSLT . Следующая трансформация XSLT 1.0:

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

  <xsl:template match="/*">
      <xsl:for-each select="@*[number(.) > 0]">
        <xsl:value-of select="concat(name(.),'=',.)"/>
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<node attribute1="10" attribute2="0" />

Дает точно такой же результат :

attribute1=10

3 голосов
/ 29 марта 2009

//node/attribute::*

Пробовал с помощью веб-приложения XPath Evaluator здесь .

Используйте XML-файл, который вам нужен, с предоставленным вами образцом узла.
Поместите выражение XPath на страницу и нажмите Eval.

Надеюсь, это поможет.

0 голосов
/ 29 марта 2009

Я полагаю, это немного зависит от контекста. В большинстве случаев я ожидаю, что вам придется запросить «@*», перечислить элементы и вызвать «name()», но это может работать в некоторых тестах.

Для редактирования - вы можете сделать:

@*[number(.)>0]

чтобы найти атрибуты, соответствующие вашим критериям, и:

concat(name(),'=',.)

для отображения вывода. Я не думаю, что вы можете сделать оба сразу. Каков контекст здесь? XSLT? что?

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