XPath 1查询和属性名称

时间:2009-03-29 08:13:31

标签: xpath attributes

第一个问题:有没有办法获得节点属性的名称

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

第二个问题:有没有办法将属性和值作为值对?情况如下:

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

我希望得到值> 0的所有属性,这样:“attribute1 = 10”。

3 个答案:

答案 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?什么?