2

这是一段 XML:

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

在 a中选择 allelements或 all很容易:elementssection.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)。

4

1 回答 1

2

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

使用这个 XPath 表达式

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

element这将选择任何没有祖先的元素 named ,sectionclass属性的字符串值为 string "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>
于 2012-04-20T13:29:27.327 回答