XPath和;选择属性值时的XQuery

XPath和;选择属性值时的XQuery,xpath,xquery,Xpath,Xquery,XPath和XQuery选择属性的方式似乎有所不同。 以下是一个从学校偷来的玩具示例: <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis<

XPath和XQuery选择属性的方式似乎有所不同。 以下是一个从学校偷来的玩具示例:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore> 

日常意大利语

我还在上验证了这一差异:它在XPath模式下可以正常工作,但在XQuery模式下不能。(注意:链接未加密。)


xpathtester.com返回以下错误消息:
错误-无法创建其父节点为文档节点的属性节点(lang)

表达式
//title/@lang
在XPath和XQuery下都有效,并返回两个属性节点的序列

您看到的不同之处在于XPath和XQuery客户端如何处理由两个属性节点组成的结果

如果该工具尝试将结果序列化为XML,它将失败,因为XML序列化尝试构造文档节点并将属性附加到文档


因此,您需要了解XPath或XQuery工具为显示结果提供了哪些选项。

在真正理解了@Martin Honnen和@Aaron所谈论的内容并深入学习了一些教程之后,我想我找到了一个我满意的解决方案:

string连接(//title/@lang return string($l))中的$l,“,”)


当XQuery无法使用时,您会得到哪种错误或结果?关于无法序列化不属于元素的属性节点的某些消息?@Martin Honnen:xpathtester.com抱怨“错误-无法创建父节点为文档节点的属性节点(lang)”但是我们的外部服务只是毫无怨言地不返回任何点击率。我认为您得到的结果将在很大程度上取决于XQuery工具及其使用的API,在XPath和XQuery中都可以选择属性节点,但XQuery的通常结果是一些新构造的、然后序列化的结果和独立属性,不能使用通常的默认XML序列化进行序列化。在XQuery3.1中,您可以使用
adaptive
output方法对它们进行序列化:默认情况下,如果XQuery无法生成有效的XML输出,它将引发错误。属性节点序列不是有效的XML输出(XML属性必须由元素节点持有,这是错误消息所抱怨的)。如果您想生成一个包含输入XML的所有属性的XML,而不使用其他输出方法,那么可以在//title/@lang return
  • {$l}
  • 中使用
    {for$l()@aron:感谢XQuery返回完整元素所需的信息。我不知道。我真的不明白你这段话的意思。结果是否与XPath
    //title
    相同?很好的一个结果,请注意,您可以将其简化为
    字符串联接(//title/@lang,“)
    ,因为
    字符串联接将自动将其输入元素转换为字符串。