1

给定以下 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代码),而是通过理解命令的实际概念/*/*/*and/*//*/*/*//@*

非常感激

4

3 回答 3

5
/*/*/*

这会选择顶部元素的所有“孙子” ——它们是:c、、、、dcd

/*//*

这将选择顶部元素的所有后代元素:b, c, d, b, c, d, e,f

/*/*//@*

这将选择顶部元素的子元素或其后代的所有属性:n, o, p, n, o, p, q, r, s

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

4, 8, 9

基于 XSLT 的验证

<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>

当对提供的 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>
 </b>
 <f s="1"/>
</a>

计算 Xpath 表达式并将其结果复制到输出

   4
=========
   8
=========
   9
于 2012-08-16T14:36:38.983 回答
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

是你的答案。

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

编辑:如 Mimo 所述的更正索引。

于 2012-08-16T14:35:45.267 回答
0

再次运行您的 java 代码,但不使用 count 函数。你会得到一个节点列表(有时是元素,有时是属性)。遍历列表并写出每个节点的名称。这将帮助您了解每个计数中包含哪些节点。

于 2012-08-16T14:21:14.577 回答