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

如何使用XSL/XSLT检查XML节点值是否仅取自指定固定节点的取值

XSLT 1.0 节点值范围校验实现方案

方案1:纯原生XSLT 1.0实现(无扩展依赖,兼容性最优)

实现思路

  • 先将所有允许的取值拼接为带唯一分隔符的字符串,避免部分匹配问题
  • 遍历待校验节点,逐个判断值是否存在于允许值字符串中

完整代码示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>

    <!-- 拼接允许的水果值,前后加分隔符|避免部分匹配 -->
    <xsl:variable name="allowedFruits">
        <xsl:text>|</xsl:text>
        <xsl:for-each select="/fruit-garden/fruit-available/fruit">
            <xsl:value-of select="."/>
            <xsl:text>|</xsl:text>
        </xsl:for-each>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:text>校验结果:
</xsl:text>
        <!-- 遍历所有待校验的晚餐水果 -->
        <xsl:for-each select="/fruit-garden/fruit-for-dinner/fruit">
            <xsl:variable name="currentFruit" select="."/>
            <xsl:choose>
                <xsl:when test="contains($allowedFruits, concat('|', $currentFruit, '|'))">
                    <xsl:value-of select="concat('✅ ', $currentFruit, ' 校验通过
')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat('❌ ', $currentFruit, ' 校验不通过,不在允许取值范围内
')"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

注:使用|作为分隔符是为了避免类似apple和pineapple的部分匹配问题,判断时给当前值也前后加|再做包含判断,保证完全匹配。


方案2:使用set:difference扩展实现(支持EXSLT的环境可用)

实现思路

set:difference并非只能操作固定路径,只需要先筛选出合法的待校验节点,再用总节点集减去合法节点集,剩下的就是非法节点:

  • 合法节点集:所有/fruit-for-dinner/fruit中,值等于任意/fruit-available/fruit值的节点
  • 非法节点集 = 所有待校验节点 - 合法节点集

代码示例

<!-- 引入set命名空间,不同处理器可能需要调整声明 -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:set="http://exslt.org/sets" extension-element-prefixes="set">
    <xsl:template match="/">
        <!-- 直接获取所有非法水果节点 -->
        <xsl:variable name="invalidFruits" select="set:difference(/fruit-garden/fruit-for-dinner/fruit, /fruit-garden/fruit-for-dinner/fruit[. = /fruit-garden/fruit-available/fruit])"/>
        
        <xsl:if test="$invalidFruits">
            <xsl:text>存在非法水果取值:
</xsl:text>
            <xsl:for-each select="$invalidFruits">
                <xsl:value-of select="concat('- ', ., '
')"/>
            </xsl:for-each>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

如果校验需要触发失败逻辑,直接判断$invalidFruits是否为空即可,非空则说明存在非法取值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:15:01