【问题标题】:XQuery - search files collection and return attribute or element without childrenXQuery - 搜索文件集合并返回没有子项的属性或元素
【发布时间】:2014-11-05 12:59:43
【问题描述】:

我想从某个文件夹中的大量 XML 文件中获取某个名称的属性列表。

在这个问题的指导下:XPath Function to query across 50 XML Files?),我也尝试使用 XQuery 进行文件查询,并安装了 Saxon 的 .Net 版本,我编写了如下查询:

Query.exe -qs:"collection('file:///Temp?select=*.xml')//group[1]/product[1]"

但从中我得到了元素下方的所有内容,包括所有子节点。 而且我找不到仅获取属性(或更具体地说是某个“prd_id”属性)的方法。

XML 看起来像这样(简化版):

` <group>
    <product prd_id="2047">
        <articles>art</articles>
        <articles>art</articles>
        <articles>art</articles>
    </product>
</group>

我希望我的 XQuery 搜索结果是一个 prd_id 属性列表,或者是一个没有子元素的纯产品节点列表(文章节点在实际文件中非常广泛,并且会阻止我选择出/复制有问题的产品属性)。

仅在查询中添加 /@prd_id 会导致如下错误:

First the query:
>Query.exe -qs:"collection('file:///Temp?select=*.xml')//group[1]/product[1]/@prd_id"

没有 systemId 的模块的第 1 行出错:XPTY0004:无法创建其父节点是文档节点的属性节点 (prd_id) 查询处理失败:报告了运行时错误

谢谢, 安德烈亚斯

【问题讨论】:

  • 我现在没有撒克逊人,所以我无法测试它,但我猜错误消息试图告诉你你不能序列化属性。使用collection('file:///Temp?select=*.xml')//group[1]/product[1]/@prd_id/string() 可能已经足够了。
  • 是的!你说的对!你想把它作为一个答案,以便我可以通过分配它“正确答案”来奖励你吗?请做!如果你碰巧知道如何在没有子节点的情况下写出一个元素,那也是很好的知识(也是第二选择)。

标签: xml xpath xquery file-search


【解决方案1】:

正如cmets中所说,属性不能序列化。因此,显式请求属性字符串值应该可以解决问题:

collection('file:///Temp?select=*.xml')//group[1]/product[1]/@prd_id/string()

关于您的第二个问题,使用纯 XPath/XQuery 是不可能的。您不能修改元素,这种语言仅用于查询(即选择某些节点、对它们进行分组等)。您需要XQuery Update 来更新元素内容或XSLT 来转换XML。

【讨论】:

  • 再次回答问题 2:写出没有子节点的节点算作修改它吗?我只是想看看。
  • 是的,这是修改(您正在删除子节点)。使用 XPth/XQuery 最简单的方法是重建一个与您想要的具有相同属性的新元素并省略子节点。
猜你喜欢
  • 2014-02-15
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多