4

这是我在此处发布的问题的非常副本, 我只需要注意这发生在 teiid 引擎的 XMLTABLE 中。我正在解析以下 xml 内容:

<AttributeSets>
    <ns2:ItemAttributes xml:lang="de-DE">
        <ns2:Creator Role="Role1">Creator One</ns2:Creator>
        <ns2:Creator Role="Role2">Creator Two</ns2:Creator>
        <ns2:Creator Role="Role3">Creator Three</ns2:Creator>
    </ns2:ItemAttributes>
</AttributeSets>

使用

    Select * From
        XMLTABLE(XMLNAMESPACES( DEFAULT 'http://ns1',
            'http://ns2/default.xsd' as ns2 ),
            'AttributeSets/ns2:ItemAttributes' PASSING x.AttributeSets
        COLUMNS 
            Creator STRING PATH 'string-join(//ns2:Creator/(@Role, node()) , '', '')'
    ) p;

这里 x.AttributeSets 是一个 xml 类型的变量,其内容来自上面。

我正在尝试使用 xpath 将其格式化并组合成一行。就像是:

string-join(//ns2:Creator/concat(./text(), @Role), ', ')

我想,我离得很近,因为:

string-join(//ns2:Creator/@Role , ', ')

工作并给我一个逗号分隔的角色列表:Role1、Role2、Role3

还有这个

string-join(//ns2:Creator/node(), ', ')

结合了创造者的价值观:“创造者一,创造者二,创造者三”。

我想要的最终输出

Role1: Creator One, Role2: Creator Two, Role3: Creator Three

我能得到的最多是:

 string-join(//ns2:Creator/(@Role, node()) , ', ')

这用逗号将所有角色和创建者分隔为一行。由于某种原因, concat 运算符似乎不起作用。能否请你帮忙。

4

1 回答 1

1

尝试以下 xpath

string-join(for $n in /AttributeSets/ItemAttributes/Creator return concat($n/@Role, ':',$n/text()),',')

请记住根据您的源代码树上下文调整for中的选择器 xpath 。我因此假设文档根

/AttributeSets/ItemAttributes/Creator

W3C的string-join函数的文档有一个非常相似的示例。

更新:

我想,我在某个地方很近,因为这:...有效并给了我一个逗号分隔的角色列表:Role1、Role2、Role3

认为你很接近。我尝试了一个小调整,这很有效:

string-join(//ns2:Creator/concat(@Role, ':', ./text()), ', ')

由于某种原因, concat 运算符似乎不起作用。

对此不确定,我在这里使用在线 xpath 测试器进行了检查,它运行良好。事实上,在线工具也接受您的 xapth,并提供以下输出:

Creator OneRole1, Creator TwoRole2, Creator ThreeRole3
于 2016-11-17T01:02:24.360 回答