xpath表达式中的属性和count()

时间:2012-08-16 14:04:42

标签: xml xpath count

给出以下XML文件:

<a m="1">
    <b n="1" o="2">
        <c p="3">3</c>
        <d/>
    </b>
    <b n="1" o="2">
        <c p="3">3</c>
        <d q="3">
            <e r="2">2</e>
        </d>
        <f s="1"/>
    </b>
</a>

如何找到以下表达式:

1. count(/*/*/*)  =  5
2. count (/*//*)  = 6
3. count (/*/*//@*) = 4

我用Java中的那些xpath表达式运行xml文件,但我不明白为什么答案是5,6,4。

有人可以解释如何计算上述表达式(不使用java代码),但要了解命令/*/*/*/*//*以及/*/*//@*的实际概念?

非常感谢

3 个答案:

答案 0 :(得分:5)

/*/*/*

这会选择所有“顶级元素的子孙 - 这些是:cdcd

/*//*

这将选择顶部元素的所有后代元素:bcdbcd,{ {1}},e

f

这将选择top元素或其后代的子元素的所有属性:/*/*//@* nopn,{ {1}},opq

因此,产生的计数必须分别为:

r

基于XSLT的验证

s

在提供的XML文档上执行此转换时(从不,永远不会出现带有图片的文档!!!):

4, 8, 9

评估Xpath表达式并将其结果复制到输出

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
   <xsl:value-of select="count(/*/*/*)"/>
=========
   <xsl:value-of select="count(/*//*)"/>
=========
   <xsl:value-of select="count(/*/*//@*)"/>
 </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:3)

1-找到元素的直接后代,它们是根元素的直接后代的直接后代 在这种情况下

/a/b[1]/c
/a/b[1]/d

/a/b[2]/c
/a/b[2]/d
/a/b[2]/f

是你的答案。

2-第一级元素下的所有后代(直接或间接)元素 在这种情况下

/a/b[1]/c
/a/b[1]/d

/a/b[2]/c
/a/b[2]/d
/a/b[2]/d/e
/a/b[2]/f

是你的答案。

3-查找属于第一级元素的直接后代的所有后代的所有属性 在这种情况下

/b[1]/@n
/b[1]/@o
/b[1]/c/@p

/b[2]/@n
/b[2]/@o
/b[2]/c/@p
/b[2]/d/@q
/b[2]/d/e/@r
/b[2]/f/@s

是你的答案。

正如你在这里看到的,第3个案例的回答是9,因为你写错了。要使其返回,您必须将其更改为count(/*/*/*/@*)

编辑:修正了Mimo所指出的指数。

答案 2 :(得分:0)

再次运行java代码,但没有count函数。您将获得一个节点列表(有时是元素和某些时间属性)。迭代列表并写出每个节点的名称。这将有助于您了解每个计数中包含哪些节点。