查找名称是另一个节点的属性和字符串常量的串联的xml节点

时间:2014-01-30 08:50:12

标签: xpath

我有一个艰难的xpath查询(我不能完全确定可以做到)。

我有以下xml

<Root>
    <PersonOne Name='jon'/>
    <PersonTwo Name='bob'/>
    <JonDetails>some text</JonDetails>
    <BobDetails>some details about Bob</BobDetails>
</Root>

我知道这是一个人为的例子,但我正在处理的xml结构是固定的,我无法改变它。

基本上我正在试图找出xpath来为PersonOne节点中的name属性选择* Detail节点。

为此,我需要在PersonOne节点中使用常量Details连接'Name'的atribute值,以将'JonDetails'作为节点名称。

到目前为止我有这个但它不起作用,但我认为这是正确的。

/Root/*[contains(name(), concat(/Root/PersonOne/@Name, 'Details'))]

但是,为了增加乐趣,它必须是节点名称上不区分大小写的匹配。我知道这可以通过翻译功能完成。

指向正确方向的任何指针?

乔恩

2 个答案:

答案 0 :(得分:2)

这个表达会更好吗?

/Root/*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = translate(concat(/Root/PersonOne/@Name, 'details'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]

它寻找完全匹配。

答案 1 :(得分:0)

想出来了!它不是太漂亮但它有效。

/Root/*[contains(translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), translate(concat(/Root/PersonOne/@Name, 'details'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]

如果有人能够改进这一点,那将会很高兴。

由于