2

XML の一部を次に示します。

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

elementsall 、またはelementsa 内のall を選択するのは簡単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 の完全な配列から悪い配列を差し引いて、1 日と呼ぶこともできますが、可能であれば、純粋な CSS ソリューション (または、必要に応じて XPath) を使用したいと思います。

4

1 に答える 1

2

section.ignored 内にないすべての要素を選択するにはどうすればよいですか?

次の XPath 式を使用します

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

これは、属性の文字列値が string であるelementという名前の祖先を持たないという名前の要素を選択します。sectionclass"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 式が評価され、選択されたすべてのノード (この場合は 1 つだけ) が出力にコピーされます。必要な正しい結果が生成されます。

<element>good</element>
于 2012-04-20T13:29:27.327 に答える