2011-12-09 14 views
1

私はサイト構造のXMLファイルを持っており、そのノードとその親の連結値に基づいてノードを検索したいと考えています。ここで連結された祖先ベクトルのXpath検索

は、XMLのサンプルです:

<site> 
    <page id="1"> 
     <url></url> 
     <url>home</url> 
     <page id="2"> 
      <url>about-us</url> 
     </page> 
     <page id="3"> 
      <url>locations</url> 
      <page id="4"> 
       <url>scotland</url> 
       <page id="5"> 
        <url>glasgow</url> 
       </page> 
       <page id="6"> 
        <url>edinburgh</url> 
       </page> 
      </page> 
     </page> 
    </page> 
</site> 

ので、URLは、私がページid=6を選択したいと思います/locations/scotland/edinburghた場合。

私は、XPathクエリは、任意のヒントは素晴らしいだろう

//page[fn:string-join(ancestor-or-self::page[ 
       url='locations/scotland/edinburgh'],'/')] 

...の分野で何か可能性が願っています。

答えて

1

あなたは、このXPath式構築と評価し、そのパスの成分にURLを分割する最初の(簡単のXPath 2.0で行うことができますが、すべてではないのXPath 1.0での)必要があります。

//page[url='locations'] 
     /page[url='scotland'] 
      /page[url='edinburgh'] 
      /@id 

これは、必要なid属性を選択します。

(6)以下のXPath式評価した結果であり、このid属性の文字列値:更新

string(//page[url='locations'] 
      /page[url='scotland'] 
      /page[url='edinburgh'] 
       /@id 
     ) 

を:

単一の汎用のXPath 2.0式は、その存在Urlを含む$pUrlという名前のパラメータを指定すると、所望のプロパティを持つすべてのpage要素が見つかります。

//page 
    [ends-with(
       concat('/', 
        string-join(ancestor-or-self::*/url, '/') 
        ), 
       $pUrl 
      ) 
    ] 

XSLT 2.0検証

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pUrl" select="'/locations/scotland/edinburgh'"/> 

<xsl:template match="/"> 

    <xsl:sequence select= 
    "//page 
     [ends-with(
        concat('/', 
         string-join(ancestor-or-self::*/url, '/') 
         ), 
        $pUrl 
       ) 
     ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

**when this transformation is applied on the provided XML document**: 

<site> 
    <page id="1"> 
     <url></url> 
     <url>home</url> 
     <page id="2"> 
      <url>about-us</url> 
     </page> 
     <page id="3"> 
      <url>locations</url> 
      <page id="4"> 
       <url>scotland</url> 
       <page id="5"> 
        <url>glasgow</url> 
       </page> 
       <page id="6"> 
        <url>edinburgh</url> 
       </page> 
      </page> 
     </page> 
    </page> 
</site> 

が望ま、正しいpage要素が選択されて出力

<page id="6"> 
    <url>edinburgh</url> 
</page> 
+0

は、連結文字列にURL文字列を比較する方法はありません各URLノードとその先祖の毎回新しいクエリを作成する必要はありません。 –

+0

@IanWood:いいえ、すべての 'url'属性を連結しない限り、これは単一のXPAth 2.0式で実行できますが、できません単一のXPath 1.0式でのみ表現されます。 –

+0

これでurl部分を連結するようになりました.xpath2のクエリはどのようなものでしょうか? –