XPATH 1.0相当于在SQL中使用嵌套查询和“ALL”关键字。例如,请考虑以下代码段。
<parent> a <child gender = "male">b</child>
<child gender = "female>c</child></parent>
<parent> z <child gender = "male"> y </child></parent>
我应该如何检索所有孩子都有性别=“男性”的节点。这可以在SQL中通过编写子查询来返回子项的性别,然后使用ALL关键字将其嵌套以检查所有子项是否为男性。
Q2 另外,我如何检索所有父母只有一个(男性)孩子。还要考虑父节点可能有其他节点。计算孩子父母的姓名“孩子”的数量,并检查孩子是否是我想要解决问题的方式。这是最好的方式还是有更好的方法呢?
注意:在我的任务中,我遇到了需要类似查询的问题。我试图自己找到答案,但不能。请帮忙
答案 0 :(得分:1)
全部:选择有孩子的父母,但没有非男性的孩子:
//parent[child and not child[@gender!="male"]]
选择只有一个男孩的父母 - 选择一个孩子只有一个男孩的父母:
//parent[count(child)=1 and child[@gender="male"]]
答案 1 :(得分:1)
How should i retrieve nodes where ALL children have gender = "male".
使用强>:
/*/parent[child
and
(not(child[not(@gender) or not(@gender='male')]))
]
这会选择:
的所有parent
元素
是XML文档顶级元素的子元素,
有一个child
孩子,
所有child
个孩子都有gender
个属性,
所有child
个孩子的gender
属性的字符串值为“男性”
这里我们使用了非常通用且有用的double-negation law
您的第二个问题:
Q2此外,我如何检索所有父母只有一个(男性) 子。
使用强>:
/*/parent[child[@gender='male']
and
not(child[2])
]
选择:
任何parent
元素,它是XML文档顶部元素的子元素,
有一个child
孩子,其gender
属性的字符串值为“男性”,
没有第二个child
孩子。
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/parent[child
and
(not(child[not(@gender) or not(@gender='male')]))
]"/>
==========
<xsl:copy-of select=
"/*/parent[child[@gender='male']
and
not(child[2])
]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(提供的文档,扩展为更具代表性):
<t>
<parent> a
<child gender="male">b</child>
<child gender="female">c</child>
<child gender="female">d</child>
</parent>
<parent> e
<child gender="male">f</child>
<child gender="male">g</child>
<child gender="female">h</child>
</parent>
<parent> z
<child gender="male">x</child>
<child gender="male">y</child>
</parent>
<parent> t
<child gender="male">u</child>
</parent>
</t>
评估两个XPath表达式,并将这些评估中的结果(选定元素)复制到输出:
<parent> z
<child gender="male">x</child>
<child gender="male">y</child>
</parent>
<parent> t
<child gender="male">u</child>
</parent>
==========
<parent> t
<child gender="male">u</child>
</parent>
答案 2 :(得分:1)
我应该如何检索所有孩子都有性别=“男性”的节点。
一些受访者认为这意味着必须至少有一个孩子。但是你要求相当于SQL的ALL运算符,我相信在SQL中(如在数学逻辑中),如果应用于空集,则ALL返回true。 (所有独角兽都有两个角 - 告诉我一个没有角。)
所以我认为对你的问题的严格回答将删除Dimitre在他的答案中包含的“孩子和”。但是Dimitre可能已经猜到了你所要求的并不是你真正想要的东西。