代码之家  ›  专栏  ›  技术社区  ›  Isaac

XPath选择,同时排除具有特定属性值的元素

  •  7
  • Isaac  · 技术社区  · 15 年前

    我看到了下面这个问题的不同表现形式,但是我试图解决的问题似乎不起作用。

    <root>
        <div>
            <p>hello</p>
            <p>hello2</p>
            <p><span class="bad">hello3</span></p>
        </div>
    </root>
    

    除了

    以下是我尝试过的:

    /root/div/node()[not (@class='bad')]
    

    ... 然而,这似乎不起作用。


    以撒

    4 回复  |  直到 15 年前
        1
  •  3
  •   Oded    15 年前

    测试XPath时 here 在提供的XML文档中,XPath似乎确实选择了所有没有属性的子节点 class="bad" -这些都是 <p> 文档中的元素。

    您将注意到,具有此类属性的唯一子节点是 <span> ,确实没有被选中。

    你在等那个吗 p span 不被选中?

        2
  •  1
  •   hemelamed    12 年前

    <span> 节点,但不是周围 <p>

    /root/div/descendant::*[not (@class='bad')]
    

    否则,如果要选择

    对于没有class='bad'子级的节点,可以使用以下内容:

    /root/div/p/*[not (@class='bad')]/..
    

    ..

        3
  •  0
  •   Steven D. Majewski    15 年前

    身份转换只是匹配和复制所有内容:

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

    但是您添加了一个更具体地匹配要排除的模式的空转换:

     <xsl:template match="span[@class='bad']" />
    

        4
  •  0
  •   FK82    15 年前

    欢迎来到SO,Isaac!

    /root/div/*[./*[@class != "bad"]]
    

    这应该选择所有子元素( * )的 div 没有子元素的元素 class 属性等于 bad .

    /root/div/*[not(*/@class "bad")]