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>

是否可以获得最深的类型名称字段?我试过这样的结构:

//*not(*)

但没有结果..

4

2 回答 2

4

I. 这个简短的 XPath 1.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>

选择这两个元素

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

因此,在您的情况下,产生所需结果的一个 XPath 表达式是:

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

二、当已知最大深度不大于给定数字时,选择具有最大深度的元素的通用 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 级,并且这种表达实际上是实用的。


三、通用 XPath 2.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 回答