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

XSLT 2.0代码转XSLT 1.0语法实现字符串拼接功能咨询

XSLT 1.0 转换方案解答

问题2:XSLT 1.0是否支持带参数的call-template调用?

结论:支持。
XSLT 1.0标准原生支持带参数的模板调用,语法和你当前XSLT 2.0代码的写法完全兼容:

  • 调用模板时用<xsl:with-param>传递参数
  • 目标模板内部用<xsl:param>声明接收参数
    这部分逻辑不需要修改,可以直接复用。

问题1:XSLT 1.0实现字符串拼接逻辑

XSLT 1.0没有内置reverse()函数,也不支持序列直接用separator属性拼接,我们可以通过xsl:for-each遍历节点轴+倒序排序实现需求,核心逻辑如下:

  1. 用ancestor-or-self轴获取当前节点及所有上级父节点
  2. 按position()倒序排序,实现从最顶层父节点到当前节点的顺序
  3. 遍历过程中判断是否是最后一个节点,控制下划线分隔符的输出

完整可运行XSLT 1.0代码

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 全局公共变量 -->
<xsl:variable name="separator" select="'|'" />
<xsl:variable name="newline" select="'&#10;'" />

<xsl:template match="/Root">
    <!-- 输出表头 -->
    <xsl:text>id|parent_id</xsl:text>
    <xsl:value-of select="$newline"/>
    <!-- 遍历数据 -->
    <xsl:for-each select="Package">
        <xsl:variable name="b-id" select="Business_ID" />
        <xsl:for-each select="TPFC">
            <xsl:variable name="total_level" select="count(.//Parent)+1"/>
            <!-- 输出当前TPFC节点的行 -->
            <xsl:call-template name="prod-family">
                <xsl:with-param name="total_level" select="$total_level"/>
                <xsl:with-param name="b_id" select="$b-id"/>
            </xsl:call-template>
            <!-- 输出所有Parent子节点的行 -->
            <xsl:for-each select=".//Parent">
                <xsl:call-template name="prod-family">
                    <xsl:with-param name="total_level" select="$total_level"/>
                    <xsl:with-param name="b_id" select="$b-id"/>
                </xsl:call-template>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

<xsl:template name="prod-family">
    <xsl:param name="total_level"/>
    <xsl:param name="b_id"/>
    <!-- 拼接id字段:包含当前节点 -->
    <xsl:for-each select="ancestor-or-self::*[local-name()='TPFC' or local-name()='Parent']">
        <xsl:sort select="position()" order="descending" />
        <xsl:value-of select="translate(Name,' ','')" />
        <xsl:if test="position() != last()">_</xsl:if>
    </xsl:for-each>
    <xsl:value-of select="$separator"/>
    <!-- 拼接parent_id字段:不包含当前节点 -->
    <xsl:for-each select="ancestor::*[local-name()='TPFC' or local-name()='Parent']">
        <xsl:sort select="position()" order="descending" />
        <xsl:value-of select="translate(Name,' ','')" />
        <xsl:if test="position() != last()">_</xsl:if>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
</xsl:template>
</xsl:stylesheet>

输出验证

使用你提供的输入XML运行上述代码,输出结果和预期完全一致:

id|parent_id
Mob2_Mob1_AM|Mob2_Mob1
Mob2_Mob1|Mob2
Mob2|

内容的提问来源于stack exchange,提问作者Sri-nidhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 15:45:02