2

特定の属性を持つ兄弟の属性のリストを取得しようとしていquxます。この場合xは、属性fooとその兄弟のy属性fooです。

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

これによりリストが作成されますが、順序を除いて、両方のパーツを別々に実行して一緒に追加するのと同じです。両方を並べてリストする必要があるquxので、qux行ごとに2つの要素のリストを作成します。これは、明らかに兄弟が一致する場所です。

これは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
4

3 に答える 3

1

単一のXPATHステートメントで結果を取得するのはそれほど簡単ではありません-XPATHは実際には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>
于 2013-03-24T17:20:54.317 に答える
1

XPath 2.0ソリューションに対するOPの表明された関心に従って、次のようになります。

このXPath2.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;')

必要な結果を生成します。

于 2013-03-25T16:00:21.653 に答える
0

要件を完全に理解していないためですが、このようなものは機能しませんか?

//@qux[../@foo = 'x' or ../@bar='y']
于 2013-03-24T17:50:08.110 に答える