Имя запроса и атрибутов 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? что?