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

XSLT新手技术咨询:如何动态声明数组并按条件添加元素以生成错误列表

解决XSLT中错误序列的构建与跨模板访问问题

嘿,作为XSLT新手,你遇到的“数组”(在XSLT 2.0里我们更常用**序列(sequence)**来实现类似数组的功能)和变量跨模板访问的问题很典型,我来帮你修正代码并实现需求:

首先先明确几个关键知识点:

  • XSLT里没有传统的可修改数组,变量是不可变的,所以我们需要一次性构建包含所有错误的序列,而不是“动态添加”元素
  • 变量的作用域仅限声明它的模板内部,要跨模板传递数据,最好用模板参数
  • 你的原代码里模板匹配路径有误:输入XML的根节点是<Employees>,不是<Employee>

修正后的完整XSLT代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 主模板:匹配根节点,收集错误并调用输出模板 -->
    <xsl:template match="/Employees">
        <!-- 收集所有符合条件的错误,构建错误序列 -->
        <xsl:variable name="errorList" as="xs:string*">
            <xsl:if test="not(data/name = 'rocky')">
                <xsl:sequence select="'name is invalid'"/>
            </xsl:if>
            <xsl:if test="not(data/sal = 10)">
                <xsl:sequence select="'salary is invalid greater than 1'"/>
            </xsl:if>
        </xsl:variable>

        <!-- 如果错误序列非空,调用输出模板并传递错误序列 -->
        <xsl:if test="$errorList">
            <xsl:apply-templates select=".">
                <xsl:with-param name="errors" select="$errorList"/>
            </xsl:apply-templates>
        </xsl:if>
    </xsl:template>

    <!-- 输出错误列表的模板,接收错误序列参数 -->
    <xsl:template match="/Employees">
        <xsl:param name="errors" as="xs:string*"/>
        
        <ErrorList>
            <xsl:for-each select="$errors">
                <Error>
                    <xsl:value-of select="."/>
                </Error>
            </xsl:for-each>
        </ErrorList>
    </xsl:template>
</xsl:stylesheet>

关键细节解释

  1. 错误序列的构建:

    • 用<xsl:variable>声明errorList,指定类型为xs:string*(表示字符串类型的序列,允许0个或多个元素)
    • 通过<xsl:if>判断条件,满足时用<xsl:sequence>向序列中添加错误文本,最终errorList会自动合并所有符合条件的错误
  2. 跨模板传递数据:

    • 用<xsl:with-param>把errorList作为参数传递给子模板
    • 子模板用<xsl:param>接收参数,这样就能在子模板里访问错误序列了
  3. 模板匹配修正:

    • 原代码里的/Employee是错误的,输入XML根节点是<Employees>,所以所有模板匹配路径都要对应调整

输出结果(匹配你的需求)

当输入你提供的XML时,会生成以下输出:

<ErrorList>
    <Error>salary is invalid greater than 1</Error>
</ErrorList>

(注:因为输入的name是rocky,所以第一个错误条件不触发;如果把name改成非rocky的值,就会同时输出两个错误)

内容的提问来源于stack exchange,提问作者andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:57:40