【问题标题】:XQuery Nodes with identic attribute values具有相同属性值的 XQuery 节点
【发布时间】:2016-09-15 07:21:59
【问题描述】:

我有一个以下结构的 XML 文档。

<Content>
<Function Name="A">
    <SubNode1>
        <SubNode2>
        </SubNode2>
    </SubNode1>
</Function> 
<Function Name="B">
    <SubNode1>
        <SubNode2>
        </SubNode2>
    </SubNode1>
</Function> 
<Function Name="A">
    <SubNode1>
        <SubNode2>
        </SubNode2>
    </SubNode1>
</Function>

现在我想用 XQuery 显示所有函数,使用这段代码。

for $currentFunction in $node where local-name($currentFunction) = 'Function'                       
return
(
    <Function>
    {
       local:printAttributes($currentFunction)
    }
    </Function>
)

这很好用。但我只想显示具有不同名称属性的函数。它应该只显示名称为 A 的函数和名称为 B 的函数,不应包含名称为 A 的最后一个函数。

我该怎么做?有什么建议么? 我正在使用 XQuery 1.0

【问题讨论】:

    标签: xml xpath distinct xquery


    【解决方案1】:

    您可以使用group by 查找同名函数:

    for $func in /Content/Function
    let $name := $func/@Name
    group by $name
    let $last-func := ($func/.)[last()]
    return <Function Name="{$name}">{
      local:printAttributes($last-func)
    }</Function>
    

    由于groups内部的顺序不规范,需要在$last-func中使用self step /.对元素进行文档顺序的排序。

    在 XQuery 1.0 中,您可以使用 fn:distinct-values(...) 模拟 group by

    for $name in distinct-values(/Content/Function/@Name)
    let $funcs := /Content/Function[@Name = $name]
    let $last-func := $funcs[last()]
    return <Function Name="{$name}">{
      local:printAttributes($last-func)
    }</Function>
    

    【讨论】:

    • 抱歉,忘了说我使用的是 XQuery 1.0 组似乎在那里不起作用?
    • 我添加了一个没有group by的解决方案。
    • 成功了!非常感谢。
    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2019-05-29
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多