Имя запроса и атрибутов XPath 1

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

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

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

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

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

3 ответов


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

<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 thransformation :

<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


//node/attribute::*

попробовал его с помощью веб-оценщика XPath здесь.

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

надеюсь, что это помогает.


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

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

@*[number(.)>0]

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

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

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