XSLT3.0实现Offering节点级循环验证的问题求助
解决XSLT3.0中Offering节点级验证错误嵌入问题
问题核心
你当前的问题是:用XSLT3.0处理整合了课程输入与源数据的XML时,所有Offering节点的验证错误都集中输出在文件末尾,无法对应到每个出错的Offering节点下方。本质原因是现有代码大概率用了全局变量或收集器统一汇总错误,没有在处理单个Offering节点时实时完成验证并输出错误信息。
解决方案:节点内实时验证输出
直接在处理每个Offering的模板里完成验证,把错误信息嵌入当前节点内部,无需全局收集。下面提供两种可行的实现方式:
方式1:用xsl:validate捕获Schema验证结果
如果你的XML是基于Schema定义的Offering类型,可直接对当前Offering节点执行验证,提取错误后嵌入节点:
<!-- 保留原XML结构,仅自定义Offering节点的处理逻辑 --> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="Offering"> <xsl:copy> <!-- 先输出Offering的原有内容 --> <xsl:apply-templates select="@* | node()"/> <!-- 对当前Offering执行Schema验证 --> <xsl:variable name="validation-result"> <xsl:validate schema-type="your-namespace:OfferingType"> <xsl:copy-of select="."/> </xsl:validate> </xsl:variable> <!-- 若存在验证错误,嵌入到当前Offering节点下 --> <xsl:if test="$validation-output/*:error"> <OfferingValidationErrors> <xsl:copy-of select="$validation-output/*:error"/> </OfferingValidationErrors> </xsl:if> </xsl:copy> </xsl:template>
方式2:用xsl:try/xsl:catch捕获验证异常
如果需要自定义错误输出格式,可利用XSLT3.0的异常捕获机制,直接捕获验证错误并格式化输出:
<xsl:mode on-no-match="shallow-copy"/> <xsl:template match="Offering"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <xsl:try> <!-- 尝试验证当前Offering节点 --> <xsl:validate schema-type="your-namespace:OfferingType"> <xsl:copy-of select="."/> </xsl:validate> <!-- 捕获验证错误并自定义输出 --> <xsl:catch select="error()"> <OfferingErrors> <ErrorEntry> <ErrorMsg><xsl:value-of select="."/></ErrorMsg> <ErrorCode><xsl:value-of select="error-code()"/></ErrorCode> <OfferingID><xsl:value-of select="@ID"/></OfferingID> </ErrorEntry> </OfferingErrors> </xsl:catch> </xsl:try> </xsl:copy> </xsl:template>
额外适配:自定义规则验证
如果不用Schema验证,而是基于自定义业务规则(比如检查字段非空),可直接在Offering模板里加入验证逻辑:
<xsl:template match="Offering"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <!-- 自定义验证规则:检查CourseCode是否为空 --> <xsl:if test="empty(CourseCode)"> <OfferingErrors> <Error>当前Offering的CourseCode字段不能为空</Error> </OfferingErrors> </xsl:if> <!-- 可添加更多自定义验证规则 --> </xsl:copy> </xsl:template>
内容的提问来源于stack exchange,提问作者Chris Tucker 2016
相关产品推荐
相关产品推荐

