Первый вопрос: есть ли способ
получить имя атрибута узла?
<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