3

次のトリッキーな XML があるとします。

<Type>
    <ID></ID>
    <Name></Name>
    <Child>
        <Type>
            <ID></ID>
            <Name></Name>
            <Child>
                <Type>
                    <ID></ID>
                    <Name></Name>
                    <Child>
                        <Type>
                            <ID></ID>
                            <Name></Name>
                            <Child>
                                <Type>
                                    <ID></ID>
                                    <Name>FIND ME</Name>
                                </Type>
                            </Child>
                        </Type>
                    </Child>
                </Type>
            </Child>
        </Type>
    </Child>
</Type>

最も深い Type の Name フィールドを取得することは可能ですか? 私はそのような構造を試しました:

//*not(*)

しかし、結果はありません..

4

2 に答える 2

4

I.この短くて単純なXPath1.0式

//*[not(../*/*)]

提供されたXMLドキュメントに対して評価された場合

<Type>
    <ID></ID>
    <Name></Name>
    <Child>
        <Type>
            <ID></ID>
            <Name></Name>
            <Child>
                <Type>
                    <ID></ID>
                    <Name></Name>
                    <Child>
                        <Type>
                            <ID></ID>
                            <Name></Name>
                            <Child>
                                <Type>
                                    <ID></ID>
                                    <Name>FIND ME</Name>
                                </Type>
                            </Child>
                        </Type>
                    </Child>
                </Type>
            </Child>
        </Type>
    </Child>
</Type>

これらの2つの要素を選択します

<ID/>
<Name>FIND ME</Name>

したがって、あなたの場合、必要な結果を生成する1つのXPath式は次のとおりです。

//*[not(../*/*)]/Name

II。最大深度が指定された数より大きくないことがわかっている場合に、最大深度を持つ要素を選択する汎用XPath 1.0式

   //*[count(ancestor::*) >= 9]
   |
    //*[not(//*[count(ancestor::*) >= 9])]
                    [count(ancestor::*) = 8]
   |
    //*[not(//*[count(ancestor::*) >= 8])]
                    [count(ancestor::*) = 7]
   |
    //*[not(//*[count(ancestor::*) >= 7])]
                    [count(ancestor::*) = 6]
   |
    //*[not(//*[count(ancestor::*) >= 6])]
                    [count(ancestor::*) = 5]
   |
    //*[not(//*[count(ancestor::*) >= 5])]
                    [count(ancestor::*) = 4]
   |
    //*[not(//*[count(ancestor::*) >= 4])]
                    [count(ancestor::*) = 3]
   |
    //*[not(//*[count(ancestor::*) >= 3])]
                    [count(ancestor::*) = 2]
   |
    //*[not(//*[count(ancestor::*) >= 2])]
                    [count(ancestor::*) = 1]

   |
    /*[not(//*[count(ancestor::*) >= 1])]

これは非常に長くて扱いにくいように見えますが、XMLドキュメントは通常4〜5レベル以下の深さであり、そのような表現は実際には実用的です。


III。一般的なXPath2.0ソリューション

//*[not(*) and count(ancestor::*) = max(//*/count(ancestor::*))]
于 2012-12-07T05:41:55.903 に答える
1

このXPathを試してください:

//Type[not(descendant::Type)]/Name
于 2012-12-06T22:20:41.870 に答える