Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何确定XPath中的嵌套级别?_Xml_Xpath_Xpath 2.0_Descendant - Fatal编程技术网

Xml 如何确定XPath中的嵌套级别?

Xml 如何确定XPath中的嵌套级别?,xml,xpath,xpath-2.0,descendant,Xml,Xpath,Xpath 2.0,Descendant,在下面的示例中,我想用XPath(2.0)表达式确定节点的“嵌套级别”。此“嵌套级别”将是连续子代的数量,例如,如果存在“span/span/span”,则为3。注释中给出了预期嵌套级别: <?xml version="1.0" encoding="UTF-8"?> <text> <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eg

在下面的示例中,我想用XPath(2.0)表达式确定节点的“嵌套级别”。此“嵌套级别”将是连续子代的数量,例如,如果存在“span/span/span”,则为3。注释中给出了预期嵌套级别:

<?xml version="1.0" encoding="UTF-8"?>
<text>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget
        dolor. Aenean massa.
        <span><!--nesting level:2-->Cum sociis natoque penatibus et magnis dis parturient montes,
            nascetur ridiculus mus.
            <span><!--nesting levels:1-->Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
                <span><!--nesting levels:0-->Nulla consequat massa quis enim.</span>
            </span>
            <span><!--nesting levels:0-->Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.</span>
            In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.
        </span>
        <span><!--nesting levels:0-->Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus
            elementum semper nisi.
        </span>
        <span><!--nesting levels:0-->Aenean vulputate eleifend tellus. Aenean leo ligula,
            porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra
            quis, feugiat a, tellus.
        </span>
    </div>
    <div>Phasellus viverra nulla ut metus varius laoreet.
        <span><!--nesting levels:0-->Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue.
        </span>
        <span><!--nesting levels:2-->Curabitur ullamcorper ultricies nisi.
            <span><!--nesting levels:0-->Nam eget dui.</span>
            Etiam rhoncus.
            <span><!--nesting levels:1-->Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet
                adipiscing sem neque sed ipsum.
                <span><!--nesting levels:0-->Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.</span>
                <span><!--nesting levels:0-->Maecenas nec odio et ante tincidunt tempus.</span>
                Donec vitae sapien ut libero venenatis faucibus.
                <span><!--nesting levels:0-->Nullam quis ante.</span>
            </span>
            Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet
            nibh.
        </span>
        Donec sodales sagittis magna.
    </div>
</text>

Lorem ipsum dolor sit amet,是一位杰出的领导者。埃尼安·康莫多·利古拉·埃吉特
多洛。埃尼安·马萨。
因怀孕而导致的自然社会问题,
黄花蛇舌草。
Donec quam felis、ultricies nec、pellentesque eu、pretium quis、sem。
这是一个很好的例子。
Donec pede justo、fringilla vel、aliquet nec、vulputate eget、arcu。
在埃尼姆·胡斯托、朗卡斯·乌特、伊佩拉、维尼那提斯·维塔、胡斯托。
猫咪的口头禅是一种很好的口头禅。整数tincidunt。克拉斯·达皮布斯。维瓦摩斯
三色元素。
埃尼安·沃普塔特·埃利芬德·泰勒斯。埃尼安·利奥·利古拉,
porttitor eu、consequat vitae、eleifend ac、enim。Aliquam lorem ante,达比布斯,维韦拉
奎斯,福吉亚,泰勒斯。
长生不老不老。
奎斯克·鲁特罗姆。埃涅亚饮食。奥古斯一世。
乌兰科乌尔里西斯库拉比图尔酒店。
南乙对。
艾蒂安·朗库斯。
麦塞纳斯·坦普斯,泰勒斯·埃吉特调味品朗卡斯,塞姆·夸姆·森佩尔·利伯罗,塞特·艾米特
同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧。
Nam quam nunc,blandit vel,luctus pulvinar,hendrerit id,lorem。
这是一个非常重要的时刻。
不要为威尼斯人的自由而浪费生命。
纳拉姆·奎斯·安特。
我坐在那里,或者我坐在那里。杜伊斯·利奥。塞德·弗林斯·莫里斯·希特·艾米特
尼布。
大矢状背根。

现在,我尝试了计数(后代::span)),但显然,这也会包括任何兄弟姐妹,并且在许多情况下会产生错误的结果。我还尝试了
count(后代::span[1])
count(后代::span[position()=1])
,这也给出了错误的结果。我还不知道如何从总数中排除兄弟姐妹的数量。任何提示都值得欣赏。

在XSLT中,我使用表达式获得正确的值

            max(
              for $leaf in descendant-or-self::span[not(span)]
              return count($leaf/ancestor-or-self::span except ancestor-or-self::span)
            )
例如,使用样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="span">
        <xsl:copy>
            <xsl:attribute name="nesting-level"
                select=" 
                max(
                  for $leaf in descendant-or-self::span[not(span)]
                  return count($leaf/ancestor-or-self::span except ancestor-or-self::span)
                )"/>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我得到输出

<?xml version="1.0" encoding="UTF-8"?><text>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget
        dolor. Aenean massa.
        <span nesting-level="2"><!--nesting level:2-->Cum sociis natoque penatibus et magnis dis parturient montes,
            nascetur ridiculus mus.
            <span nesting-level="1"><!--nesting levels:1-->Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
                <span nesting-level="0"><!--nesting levels:0-->Nulla consequat massa quis enim.</span>
            </span>
            <span nesting-level="0"><!--nesting levels:0-->Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.</span>
            In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.
        </span>
        <span nesting-level="0"><!--nesting levels:0-->Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus
            elementum semper nisi.
        </span>
        <span nesting-level="0"><!--nesting levels:0-->Aenean vulputate eleifend tellus. Aenean leo ligula,
            porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra
            quis, feugiat a, tellus.
        </span>
    </div>
    <div>Phasellus viverra nulla ut metus varius laoreet.
        <span nesting-level="0"><!--nesting levels:0-->Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue.
        </span>
        <span nesting-level="2"><!--nesting levels:2-->Curabitur ullamcorper ultricies nisi.
            <span nesting-level="0"><!--nesting levels:0-->Nam eget dui.</span>
            Etiam rhoncus.
            <span nesting-level="1"><!--nesting levels:1-->Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet
                adipiscing sem neque sed ipsum.
                <span nesting-level="0"><!--nesting levels:0-->Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.</span>
                <span nesting-level="0"><!--nesting levels:0-->Maecenas nec odio et ante tincidunt tempus.</span>
                Donec vitae sapien ut libero venenatis faucibus.
                <span nesting-level="0"><!--nesting levels:0-->Nullam quis ante.</span>
            </span>
            Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet
            nibh.
        </span>
        Donec sodales sagittis magna.
    </div>
</text>

Lorem ipsum dolor sit amet,是一位杰出的领导者。埃尼安·康莫多·利古拉·埃吉特
多洛。埃尼安·马萨。
因怀孕而导致的自然社会问题,
黄花蛇舌草。
Donec quam felis、ultricies nec、pellentesque eu、pretium quis、sem。
这是一个很好的例子。
Donec pede justo、fringilla vel、aliquet nec、vulputate eget、arcu。
在埃尼姆·胡斯托、朗卡斯·乌特、伊佩拉、维尼那提斯·维塔、胡斯托。
猫咪的口头禅是一种很好的口头禅。整数tincidunt。克拉斯·达皮布斯。维瓦摩斯
三色元素。
埃尼安·沃普塔特·埃利芬德·泰勒斯。埃尼安·利奥·利古拉,
porttitor eu、consequat vitae、eleifend ac、enim。Aliquam lorem ante,达比布斯,维韦拉
奎斯,福吉亚,泰勒斯。
长生不老不老。
奎斯克·鲁特罗姆。埃涅亚饮食。奥古斯一世。
乌兰科乌尔里西斯库拉比图尔酒店。
南乙对。
艾蒂安·朗库斯。
麦塞纳斯·坦普斯,泰勒斯·埃吉特调味品朗卡斯,塞姆·夸姆·森佩尔·利伯罗,塞特·艾米特
同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧同侧。
Nam quam nunc,blandit vel,luctus pulvinar,hendrerit id,lorem。
这是一个非常重要的时刻。
不要为威尼斯人的自由而浪费生命。
纳拉姆·奎斯·安特。
我坐在那里,或者我坐在那里。杜伊斯·利奥。塞德·弗林斯·莫里斯·希特·艾米特
尼布。
大矢状背根。

非常感谢!这令人印象深刻。我没想到解决办法会如此复杂。我以后得检查一下,抱歉耽搁了!对于给定的示例,这可能给出了正确的答案,但它并不试图满足路径中的span元素必须是连续的要求:它将报告
span/div/div/span/span
的嵌套级别3,以解决我认为必须使用
[祖先中的每一个$::*除了$原产地/祖先::*满足$A/B::SUPP] < /COD>其中$Objax绑定到最外层上下文节点。谢谢,米迦勒,您的评论。虽然马丁的解决方案对我的用例足够了,但在其他场景中,您的观点将是重要的。