私が解決しようとしている問題は、一意のテキスト要素のみを含むすべての要素を取得すると同時に、XSLT シートにパラメーターとして渡された要素名に基づいてノード ツリーを除外することです。
空ではない一意のテキスト要素のみを含むすべてのノードを選択する部分は、比較的簡単でした。
$StartNode//element()/text()[normalize-space(.)]/parent::*
は$StartNode
、XML ドキュメント内の特定の要素への Xpath 式です。
ここで、結果から特定のノード ツリーを除外することで、いくつかの問題が発生しました。
だから私は次のようなことを望んでいました:
$StartNode//element()/text()[normalize-space(.)]/parent::*[not(ancestor::**$element_to_be_excluded**)]
$element_to_be_excluded は、除外する要素の名前です。
しかし、式のその部分で変数を使用することはできません...
だから私はこの解決策を思いついた
<xsl:variable name="ancestors_of_current_node" as="xs:string*">
<xsl:sequence select="$current_parent_node/ancestor::*/name()"/>
</xsl:variable>
<xsl:variable name="is_value_in_sequence" as="xs:boolean" select="functx:is-value-in-sequence($exclude_node_local_name, $ancestors_of_current_node)"/>
<xsl:if test="not($is_value_in_sequence)">
<xsl:call-template name="dataElementMap">
<xsl:with-param name="node_item" select="$current_parent_node"/>
</xsl:call-template>
</xsl:if>
functx:is-value-in-sequence は次のとおりです。
<xsl:function name="functx:is-value-in-sequence" as="xs:boolean" xmlns:functx="http://www.functx.com">
<xsl:param name="value" as="xs:anyAtomicType?"/>
<xsl:param name="seq" as="xs:anyAtomicType*"/>
<xsl:sequence select="$value = $seq"/>
</xsl:function>
問題は、この問題を解決するためのよりエレガントな方法があるかどうかです。
ヒントをお寄せいただきありがとうございます。
よろしくVlax