2012-02-07 11 views
1

私はxml形式の設定ファイルを持っています。つまり、一部のセクションに最も近い設定は、それが上位レベルに設定されていても有効になる設定です。同僚はXPathを使ってこれを提案しました。しかし、私はそれがどのように機能するのか分からないのですか?私は設定のために「最も深いマッチ」を見つけて、それからマッチがなければ自動的にバックアウトしたいと思う。例えば最初にXPathとの最も深いマッチ

<Settings> 
<Foo>Bar</Foo> 
<Products> 
    <Bar>Baz</Bar> 
    <Product Name="Thingamabob"> 
    <Foo>Baz</Foo> 
    </Product> 
    <Product Name="Whizbang"> 
    <Bar>Foo</Bar> 
    </Product> 
</Products> 
</Settings> 

ThingamabobためBar設定の検索はのWhizBangの "バズ" が、 "foo" を返す必要があります。同じように、Fooの値はThingamabobでは "Baz"、Whizbangでは "Bar"です。

このタイプの検索はXPathで実装できますか? ThingamabobFooを検索

答えて

0

はそう

//*[@Name='Thingamabob']/ancestor-or-self::*/Foo 

のように行うことができます。しかし、これは次の2つのノードを与える、あなたは

Iドンを最大count(ancestor::*)を持つノードを取得し、そのtext()値を取得したいですあなたのようなxml階層でmaxを実行する方法を知っているなら、xpathによって与えられたノードリストを外部スクリプトで繰り返し、最大深度を見つけ出し、その内容を取得してください。

EDIT:

あなたはXSLT 2.0でこれを行うことができるかもしれませんが、私はこれをテストしていません注意してください。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:function name="my:lookup"> 
    <xsl:param name="name"/> 
    <xsl:param name="arg"/> 
    <xsl:for-each select="//*[@Name='$name']/ancestor-or-self::*/$arg"> 
     <xsl:sort select="count(ancestor::*)" data-type="number" order="descending"/> 
     <xsl:if test="position()=1"><xsl:value-of select="."/></xsl:if> 
    </xsl:for-each> 
    </xsl:function> 

    <xsl:template match="/"> 
     <xsl:copy-of select="my:lookup('Thingamabob','Foo')" /> 
    </xsl:template> 

</xsl:stylesheet> 

EDIT 2:

また、私は、これはXPATH 2.0で動作するはずですが、あなたは<バー>が先行することを確かに知っていれば、私はそれを

//*[@Name='Thingamabob']/ancestor-or-self::*/Foo[count(ancestor::*) >= //*[@Name='Thingamabob']/ancestor-or-self::*/Foo/count(ancestor::*)]/text() 
-1

をテストしていませんでした把握しました<製品>の場合は、次のようにしてください:

//Product[@Name='Thingamabob']/preceding-sibling::Bar|//Product[@Name='Thingamabob']/Bar 
+0

まあ、私はしません。 Whizbangの例で分かるように、 'Bar'は' Product'内で発生する可能性があります。 – carlpett

+0

ああ、私はそれを見ませんでした。子のBar要素を含むようにxpathを更新しました。また、最初に "//"を付け加えましたが、これは通常悩まされていますが、あなたのスキーマはかなり緩やかです。 – JohnnyK

関連する問題