2013-03-24 2 views
2

Я пытаюсь получить список qux атрибутов братьев и сестер с определенным атрибутом, в этом случае x в атрибуте foo и y в атрибуте foo из его родного брата.возвращаются два XML-узлов сразу

//node[@foo="x" and following-sibling::node[@foo="y"]]/@qux | //node[@foo="y" and preceding-sibling::node[@foo="x"]]/@qux 

Это создает список, но так же, как работает обе части отдельно и добавить их вместе, для того исключением. Мне нужен список как qux рядом друг с другом, так и список из двух qux элементов в строке, очевидно, где братья и сестры совпадают.

Можно ли это сделать в xpath, и если да, то как? Если нет, выполнит ли xquery работу?

редактирование: пример файл и вывод:

<database> 
    <ds version="1"> 
    <node> 
    <node foo="x" qux="hello"/> 
    <node foo="y" qux="world"/> 
    </node> 
    </ds> 
    <ds version="1"> 
    <node> 
    <node> 
     <node foo="x" qux="another"/> 
     <node foo="y" qux="sentence"/> 
     <node foo="y" qux="example"/> 
     <node foo="z" qux="irrelevant"/> 
    </node> 
    </node> 
    </ds> 
    <ds version="1"> 
    <node> 
     <node foo="y" qux="not"/> 
     <node foo="z" qux="returned"/> 
    </node> 
    </ds> 
</database> 

Обратите внимание, что глубина узла меня интересует не известно, так (я думаю) использование // узла необходим.

Запрос должен возвращать:

hello world 
another sentence 
another example 
+1

Это может быть сделано одним выражением XPath 2.0. Он не может быть создан одним выражением XPath 1.0. Если вас заинтересует решение XPath 2.0, сообщите мне. –

+0

Меня интересует ваше решение, мне все равно, это XPath 1.0, XPath 2.0 или что-то еще :) – user2204975

+0

user2204975, Done. –

ответ

1

В соответствии с выраженным интересом ФПА в качестве решения XPath 2.0:

Это XPath 2.0 выражения:

for $n in //node[@foo eq 'x' and following-sibling::*[1][self::node[@foo eq 'y']]] 
return 
    (($n|$n/following-sibling::*[1])/@qux/string(), '&#xA;') 

производит желаемый результат.

1

его не так легко получить ваши результаты с одной XPATH Оператор- XPATH является intented для XML-навигации на самом деле. XSL используется для преобразований XML (именно это вы хотите сделать, т. Е. Преобразовать список атрибутов [hello] [world] в строку «hello world» ..) Итак, вот XSL, вам нужно получить нужные результаты -

<?xml version="1.0" encoding="UTF-8"?> 
<?altova_samplexml file:///C:/Users/Damien/Desktop/testXML.xml?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath- 
functions"> 
<xsl:template match="/">  
    <xsl:for-each select="//node[@foo='x' and following- 
sibling::node[@foo='y']]/@qux | //node[@foo='y' and preceding- 
sibling::node[@foo='x']]/@qux"> 
     <xsl:value-of select="."/> 
     <xsl:text> </xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

Это не гарантирует, что узел foo = 'y' соответствует двум предложениям, это может быть другой узел, который также имеет foo = 'y'. Кроме того, я не думаю, что это можно было бы выполнить, запустив xpath и удалив все символы новой строки, верно? Я ценю ваш вклад. Я немного изменил свое оригинальное сообщение, чтобы быть более четким. – user2204975

0

Из-за отсутствия полного понимания требований, но не будет что-то вроде этой работы?

//@qux[../@foo = 'x' or ../@bar='y'] 
+0

Нет, но я уточнил, какие требования приведены на примере. Я также понял, что мне не нужен «бар», поэтому я немного изменил свой вопрос. – user2204975

Смежные вопросы