如何仅对XSLT中CD123节点内的for-each模板执行处理?
问题描述
现有如下XSLT文件:
<xsl:stylesheet version="1.0"> <xsl:function name="grp:MapToCD538A_var107"> <xsl:param name="var106_cur" as="node()"/> <xsl:param name="var106_cur" as="node()"/> <xsl:for-each select="$var106_cur/containerIdentificationNumber"> <xsl:sequence select="fn:string(.)"/> </xsl:for-each> </xsl:function> <xsl:template match="/"> <CD123> <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance"/> <xsl:for-each select="(./ns0:CD538C)[fn:not(fn:exists(*:ExportOperation[fn:namespace-uri() eq '']/*:requestRejectionReasonCode[fn:namespace-uri() eq '']))]"> <SynIde xmlns="">UN1OC</SynIde> </xsl:for-each> </CD123> </xsl:template> </xsl:stylesheet>
文件内存在两个<xsl:for-each>元素:一个位于函数grp:MapToCD538A_var107中,另一个在根匹配模板的<CD123>节点下。
当前使用的XSLT模板:
<xsl:template match="xsl:for-each"> <xsl:copy> <xsl:apply-templates select="@*"/> <!-- PULL PARENT AND SIBLING NODES --> <xsl:element name="{name(..)}"> <xsl:apply-templates select="preceding-sibling::*[1]"/> <xsl:apply-templates select="*"/> </xsl:element> </xsl:copy> </xsl:template>
会匹配所有<xsl:for-each>并应用处理逻辑,现需修改该模板,仅对<CD123>节点内的<xsl:for-each>执行上述处理逻辑,该如何实现?
解决方案
要实现仅匹配<CD123>节点内的<xsl:for-each>,只需要修改模板的match属性,通过路径表达式精准定位目标节点:
<xsl:template match="xsl:template[@match='/']/xsl:element[@name='CD123']/xsl:for-each"> <xsl:copy> <xsl:apply-templates select="@*"/> <!-- PULL PARENT AND SIBLING NODES --> <xsl:element name="{name(..)}"> <xsl:apply-templates select="preceding-sibling::*[1]"/> <xsl:apply-templates select="*"/> </xsl:element> </xsl:copy> </xsl:template>
逻辑说明:
xsl:template[@match='/']:定位到根匹配的模板节点/xsl:element[@name='CD123']:找到该模板下名为CD123的元素节点/xsl:for-each:最终匹配这个<CD123>节点下的所有<xsl:for-each>元素
如果你的XSLT处理器支持更简洁的轴定位,也可以用ancestor轴来匹配:
<xsl:template match="xsl:for-each[ancestor::xsl:element[@name='CD123']]"> <!-- 原有处理逻辑不变 --> </xsl:template>
这种写法更直观,直接匹配所有拥有<xsl:element[@name='CD123']>祖先节点的<xsl:for-each>。
内容的提问来源于stack exchange,提问作者RamAlx
相关产品推荐
相关产品推荐

