给出以下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代码),但要了解命令/*/*/*
和/*//*
以及/*/*//@*
的实际概念?
非常感谢
答案 0 :(得分:5)
/*/*/*
这会选择所有“顶级元素的子孙 - 这些是:c
,d
,c
,d
/*//*
这将选择顶部元素的所有后代元素:b
,c
,d
,b
,c
,d
,{ {1}},e
f
这将选择top元素或其后代的子元素的所有属性:/*/*//@*
,n
,o
,p
,n
,{ {1}},o
,p
,q
。
因此,产生的计数必须分别为:
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函数。您将获得一个节点列表(有时是元素和某些时间属性)。迭代列表并写出每个节点的名称。这将有助于您了解每个计数中包含哪些节点。