Первый вопрос: есть ли способ для получить имя атрибута узла?
<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
FLOWR XPath 2 или будет 'для $ i в @ * [. > 0] return concat (local-name ($ i), "=", $ i) 'будет нормально для XPath 1.0? – TheConstructor
@ TheConstructor, XPath 2.0 и более поздние версии. –