移植可能な (XPath 1.0 および 2.0) ソリューションは次のようになります。
<xsl:if test="
$currentNode/ancestor::*[generate-id() = generate-id($someNode)]
">
Write this out.
</xsl:if>
これは祖先軸を上に移動し、その中のすべての要素をチェックします。いずれかの祖先の一意の ID が の一意の ID と一致する場合 (およびその場合のみ)、$someNode
結果のノードセットは空ではありません。
空でないノード セットは true と評価されるため、条件が満たされます。
テスト -<baz>
の子孫であるすべてを検索<foo>
:
<xml>
<foo>
<bar>
<baz>Test 1</baz>
</bar>
</foo>
<baz>Test 2</baz>
</xml>
と
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="/">
<xsl:variable name="someNode" select="//foo[1]" />
<!-- test each <baz> node if it has <foo> as a parent -->
<xsl:for-each select="//baz">
<xsl:if test="
ancestor::*[generate-id() = generate-id($someNode)]
">
<xsl:copy-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
結果は
<baz>Test 1</baz>
for-each で行ったように、実際$currentNode
の現在のノードを参照している場合は、個別の変数は必要ないことに注意してください。デフォルトでは、すべての XPath は現在のノードに相対的です。
バリアントはトップダウンの方法です。ただし、効率は低くなります(おそらく数桁)。
<xsl:if test="
$someNode[//*[generate-id() = generate-id($currentNode)]]
">
Write this out.
</xsl:if>