XQuery: Как получить из тега конкретное значение c? - PullRequest
1 голос
/ 19 июня 2020

Предположим, у нас есть это xml:

<question>
    <test id="1">
        <tag k="a" v="1"/>
        <tag k="a" v="2"/>
        <tag k="b" v="3"/>
    </test>
    <test id="2">
        <tag k="a" v="1"/>
        <tag k="a" v="4"/>
        <tag k="b" v="5"/>
    </test>
    <test id="3">
        <tag k="a" v="2"/>
        <tag k="a" v="6"/>
        <tag k="b" v="7"/>
    </test>
</question>

Я хотел бы вернуть все значения v теста, если k = "a" AND v = "1", например:

v="3"
v="5"

Пока мой подход:

for $i in //test
where ($i/tag[@k = 'a' and @v = '1'])
return $i/tag/@v

Но это неверно, потому что это результат:

v="1"
v="2"
v="3"
v="1"
v="4"
v="5"

Спасибо за вашу помощь :)

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Ваши критерии выбора не совсем ясны, но это возвращает то, что вы ожидали:

for $i in //test
where $i/tag[@k = 'a' and @v = '1']
return $i/tag[not(@k = 'a' or @v = '1')]/@v

Вы можете упростить и сделать это с помощью одного выражения XPath:

//test/tag[@k = 'a' and @v = '1']/tag[not(@k = 'a' or @v = '1')]/@v
1 голос
/ 19 июня 2020

Вероятно, вы ищете что-то вроде

for $i in //test
where  ($i/tag[@k = 'a'][@v="1"])
return $i/tag[@k="b"]/@v
...