如何使用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
相关产品推荐
相关产品推荐

