使用CSS或XPath排除另一个元素中包含的元素

时间:2012-04-20 03:58:16

标签: css ruby xml xpath css-selectors

这是一大块XML:

<xml>
  <section>
    <element>good</element>
    <section class="ignored">
      <element>bad</element>
    </section>
  </section>
</xml>

选择elements内的所有elements或全部section.ignored非常容易:

@doc.css('element').text
 => "goodbad" 
@doc.css('section.ignored element').text
 => "bad" 

但如何在elements内选择的所有section.ignored?这不起作用:

@doc.css('section:not(.ignored) element').text
 => "goodbad" 

...因为这实际上意味着“任何部分中包含的所有未被忽略的元素”,包括包装其他所有内容的顶级部分!

附加扭曲:与上面的简化示例不同,我必须处理的真实XML嵌套到任意深度,包括被忽略部分中的部分。

是的,我可以从Ruby中的完整数组中减去坏数组并将其称为一天,但如果可能的话,我更喜欢纯CSS解决方案(或者,如果必须,还可以使用XPath)。

1 个答案:

答案 0 :(得分:2)

  

如何选择不在section.ignored中的所有元素?

使用此XPath表达式

//element[not(ancestor::section[@class='ignored'])]

这将选择任何名为element且没有名为section的祖先的元素,其class属性为字符串"ignored"的字符串值。

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "//element[not(ancestor::section[@class='ignored'])]"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<xml>
    <section>
        <element>good</element>
        <section class="ignored">
            <element>bad</element>
        </section>
    </section>
</xml>

评估上述XPath表达式,并将所有(在这种情况下只有一个)选定节点复制到输出中。产生了想要的正确结果

<element>good</element>
相关问题