第一个问题:有没有办法获得节点属性的名称?
<node attribute1="value1" attribute2="value2" />
第二个问题:有没有办法将属性和值作为值对?情况如下:
<node attribute1="10" attribute2="0" />
我希望得到值> 0的所有属性,这样:“attribute1 = 10”。
答案 0 :(得分:12)
第一个问题:有没有办法 获取节点属性的名称?
<node attribute1="value1" attribute2="value2" />
是:
此XPath表达式(当node
是上下文(当前)节点时)):
<强> name(@*[1])
强>
生成第一个属性的名称(排序可能依赖于实现)
和此XPath表达式(当node
是上下文(当前)节点时)):
<强> name(@*[2])
强>
生成第二个属性的名称(排序可能依赖于实现)。
第二个问题:有没有办法获得 属性和值作为值对? 情况如下:
<node attribute1="10" attribute2="0" />
我希望获得所有属性 值&gt; 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
强>
答案 1 :(得分:3)
//node/attribute::*
使用基于网络的XPath评估器here进行尝试。
使用您想要的XML以及您提供的示例节点 将XPath Expression放在页面上&amp;点击Eval。
希望这有帮助。
答案 2 :(得分:0)
我相信这取决于具体情况。在大多数情况下,我希望您必须查询“@*
”,对项目进行枚举,然后调用“name()
” - 但它可能会在某些测试中有效。
重新编辑 - 你可以这样做:
@*[number(.)>0]
查找符合条件的属性,并且:
concat(name(),'=',.)
显示输出。不过,我认为你不能同时做到这两件事。这里的背景是什么? XSLT?什么?