Xml xquery返回两个元素和两个谓词?
我正试图从这个列表中得到一个名字列表——但它只是给了我一个“真实”的答案——我做错了什么Xml xquery返回两个元素和两个谓词?,xml,xpath,xquery,Xml,Xpath,Xquery,我正试图从这个列表中得到一个名字列表——但它只是给了我一个“真实”的答案——我做错了什么 for $x in /Book where $x//Occupation/text()="Builder" and $x//Sex/text()="M" return $x//Name/text() and $x//LastName/text() 我哪里做错了 XML示例: ` <Person> <Name>Mathew</Name> <LastN
for $x in /Book
where $x//Occupation/text()="Builder" and $x//Sex/text()="M"
return $x//Name/text() and $x//LastName/text()
我哪里做错了
XML示例:
`
<Person>
<Name>Mathew</Name>
<LastName>Michaels</LastName>
<Relation>Father</Relation>
<Religion>Roman Catholic</Religion>
<Education>Read</Education>
<Age>83</Age>
<Sex>M</Sex>
<Occupation>Builder</Occupation>
<Maried>Widower</Maried>
<PlaceOfBirth>Co. Kildare</PlaceOfBirth>
</Person> `
马修
迈克尔斯
父亲
罗马天主教
阅读
83
M
建设者
鳏夫
基尔代尔郡
`
在“return”子句之后指定的表达式组合在一个逻辑运算中,该运算始终返回true
或false
。以下两个版本可能会满足您的需要:
for $x in /Book
where $x//Person/text()="Builder" and $x//Place/text()="F"
return ($x//Name/text(), $x//LastName/text())
for $x in /Book
where $x//Person/text()="Builder" and $x//Place/text()="F"
return ($x//Name/text() | $x//LastName/text())
“return”子句之后指定的表达式组合在一个逻辑运算中,该运算始终返回
true
或false
。以下两个版本可能会满足您的需要:
for $x in /Book
where $x//Person/text()="Builder" and $x//Place/text()="F"
return ($x//Name/text(), $x//LastName/text())
for $x in /Book
where $x//Person/text()="Builder" and $x//Place/text()="F"
return ($x//Name/text() | $x//LastName/text())
返回布尔值(true或false),因为您使用的是布尔表达式(
X和Y
)。如果要返回两个节点序列的并集,请改用管道符号(X | Y
),或者如果要返回X在Y之前的序列,请使用逗号(X,Y
)。或者,如果要返回两个字符串的串联,请使用concat()
函数(如下面的示例所示)
我想也许你不明白“for”的表达方式是如何工作的。$x变量绑定到“中的之后的表达式返回的任何节点序列。因此,在您的例子中,$x被绑定到一个
元素(或者,根据您的XQuery实现,可能是数据库中的所有
文档元素)。由于$x绑定到
,这意味着您的查询本质上是这样说的(如果您首先进行上述更正,将“and”替换为“|”):“如果此
文档中有任何
元素带有“Builder”和任何
元素带有“M”,然后返回所有
文档的
和
文本节点子节点
因此,看起来您真正想要的是将$x绑定到
元素(假设
显示为
的子元素,您的示例XML没有指定):
注意,我做了一些更改。我删除了“/”而改为“/”,因为您的示例XML显示
、
、
和
是
的子项。如果您不知道元素可能出现在何处(n层深),请仅使用“/”,原因有二:
“//”比“/”慢,因为这意味着XQuery引擎必须搜索更多的地方
您的代码暗示了错误的事情:这些元素可以显示为子元素(不一定总是显示为直接子元素)
我还添加了concat()函数,因为我怀疑这与您试图提取的内容很接近
我还取消了text()
节点测试。一般来说,你不需要它们(应该避免它们)。您真正想要做的是比较每个元素的字符串值,而不是每个文本节点子节点的字符串值。您可能知道每个元素只有一个子文本节点,但没有理由编写在以下情况下会中断的代码:
<Religion>Roman <!--comment-->Catholic</Religion>
返回布尔值(true或false),因为您使用的是布尔表达式(X和Y
)。如果要返回两个节点序列的并集,请改用管道符号(X | Y
),或者如果要返回X在Y之前的序列,请使用逗号(X,Y
)。或者,如果要返回两个字符串的串联,请使用concat()
函数(如下面的示例所示)
我想也许你不明白“for”的表达方式是如何工作的。$x变量绑定到“
中的之后的表达式返回的任何节点序列。因此,在您的例子中,$x被绑定到一个
元素(或者,根据您的XQuery实现,可能是数据库中的所有
文档元素)。由于$x绑定到
,这意味着您的查询本质上是这样说的(如果您首先进行上述更正,将“and”替换为“|”):“如果此
文档中有任何
元素带有“Builder”和任何
元素带有“M”,然后返回所有
文档的
和
文本节点子节点
因此,看起来您真正想要的是将$x绑定到
元素(假设
显示为
的子元素,您的示例XML没有指定):
注意,我做了一些更改。我删除了“/”而改为“/”,因为您的示例XML显示
、
、
和
是
的子项。如果您不知道元素可能出现在何处(n层深),请仅使用“/”,原因有二:
“//”比“/”慢,因为这意味着XQuery引擎必须搜索更多的地方
您的代码暗示了错误的事情:这些元素可以显示为子元素(不一定总是显示为直接子元素)
我还添加了concat()函数,因为我怀疑这与您试图提取的内容很接近
我还取消了text()
节点测试。一般来说,你不需要它们(应该避免它们)。您真正想要做的是比较每个元素的字符串值,而不是每个文本节点子节点的字符串值。您可能知道每个元素只有一个子文本节点,但没有理由编写在以下情况下会中断的代码:
<Religion>Roman <!--comment-->Catholic</Religion>
“and”是一个布尔运算符-结果总是true或false。而在英语中,我们可以使用“and”来获得两个集合的并集(“给我书的作者和书名”),在逻辑中,“and”总是结合两个布尔值(因此,如果作者和书名都存在,则“author”和“title”是真的)。因此,您的“and”操作符需要替换为“union”操作符,或者其他结合了
/Book/Person[Occupation eq "Builder"][Sex eq "M"]/concat(Name,' ',LastName)
for $x in X return (a, b)
(for $x in X return a), b