Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xquery返回两个元素和两个谓词?_Xml_Xpath_Xquery - Fatal编程技术网

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