1

「content」を含むIDまたはクラスを持つhtmlドキュメントのほとんどの内部divにアクセスしたいと思います。

私が試したこと:

//div[@id[contains(.,'content') and not(*)]]

これは、「content」を含むIDを持つ最も内側のdivを取得するために機能します。

ここで、IDまたはクラス「content」を含むIDまたはクラス(最も内部が何であるかによって異なります)ごとに、最も内部のdivを取得したいと思います。

サンプルデータ:

<body>
<div class="outerContent">
    <div id="moreContent">
        <div class="anotherContent">
            This is what I am looking for.
        </div>
    </div>
</div>
</body>

また

<body>
<div class="outerContent">
    <div id="moreContent">
        <div id="anotherContent">
            This is what I am looking for.
        </div>
    </div>
</div>
</body>

「これは私が探しているものです」は、「コンテンツ」を含むdivクラスまたは「コンテンツ」を含むdivID内にある可能性があることに注意してください。

ありがとうございました!

4

3 に答える 3

0

更新しました。

私があなたの質問を正しく理解しているなら、これは私がそれをする方法です://descendant::div[last()][contains(@id,'Content')]

いずれかの場合に@idをチェックする必要がある場合は、パーツの周囲で変換関数@idを使用してください。

于 2013-01-14T20:53:56.183 に答える
0

この回答では、XPath1.0式のみを使用しています。私の理解では、XPath2.0は利用できません。

使用

//div[contains(@id, 'Content') or contains(@class, 'Content')]
       [not(descendant::div[contains(@id, 'Content') or contains(@class, 'Content')])]

これにより、属性に文字列を含む文字列値があるdiv要素、または属性に文字列を含む文字列値があり、このプロパティを持つ子孫要素がない要素が選択されます。id"content"class"content"div

「最も内側のdiv」などは特異ではない可能性があることに注意してください。つまり、質問で設定された条件を満たすように多くのdiv要素が存在する可能性があります。

これが当てはまり、そのようなdiv要素が1つだけ必要な場合(たとえば、1番目)、次を使用できます

(//div[contains(@id, 'content') or contains(@class, 'content')]
        [not(descendant::div[contains(@id, 'content') or contains(@class, 'content')])]
)[1]

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=
     "//div[contains(@id, 'Content') or contains(@class, 'Content')]
       [not(descendant::div[contains(@id, 'Content') or contains(@class, 'Content')])]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が最初に提供されたXMLドキュメントに適用される場合:

<body>
    <div class="outerContent">
        <div id="moreContent">
            <div class="anotherContent">
            This is what I am looking for.
            </div>
        </div>
    </div>
</body>

Xpath式が評価され、この評価の結果が出力にコピーされます。

<div class="anotherContent">
            This is what I am looking for.
            </div>

2番目のドキュメントでも、正しい結果が生成されます。

<div id="anotherContent">
            This is what I am looking for.
        </div>

最後に、「コンテンツ」の比較を大文字と小文字を区別しない場合は、次を使用します。

  //div[contains(translate(@id,'CONTE','conte'), 'content')
      or contains(translate(@class,'CONTE','conte'), 'content')
       ]
         [not(descendant::div
               [contains(translate(@id,'CONTE','conte'), 'content')
               or contains(translate(@class,'CONTE','conte'), 'content')
               ]
              )
         ] 
于 2013-01-15T01:30:29.753 に答える
0

あなたの正確な質問について完全に明確ではないので、2つの解釈をします。

<div/>述語を満たす他の要素はありません

この述語を満たす他のものを含まない「コンテンツ」を含む<div/>@classまたは含む。これにより、 内の他のマークアップが可能になります。@id<div/><div/>

//descendant::div
  (: either @id or @class contain 'content' :)
  [contains(lower-case(@id), 'content') or contains(lower-case(@class), 'content')]
  (: only inner-most div fulfilling this condition :)
  [last()]

テキスト以外の何物でもない

内に要素ノードがあってはなりません<div/>

//descendant::*
  (: only inner-most elements :)
  [last()]
  (: which are a div :)
  [local-name(.) eq 'div']
  (: and either @id or @class contain 'content' :)
  [contains(lower-case(@id), 'content') or contains(lower-case(@class), 'content')]

XQuery 2.0 のサポートを受けていない場合は、何も利用できないはずfn:lower-case()です。その場合は、それを取り除き、提供したデータの「コンテンツ」を「コンテンツ」に置き換える必要があります。

XQuery 2.0 をサポートしている場合は、これをより拡張可能な述語として使用することもできます (新しい属性をリストに追加するのがはるかに簡単で、冗長なコードが少なくなります)。

[some $attribute in (@id, @class) satisfies contains(lower-case($attribute), 'content')]
于 2013-01-15T00:43:31.193 に答える