この回答では、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')
]
)
]