这是一大块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)。
答案 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>