You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:15:32