我要解决的问题是获取仅包含唯一文本元素但同时还能够根据作为参数传递给 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