基于指定值优先级选择节点的XSLT 2.0简化实现问询
更简洁的XSLT 2.0实现方案
当然有更简洁的实现方式,完全不用正则表达式——用XSLT 2.0的**序列(Sequence)**和节点值匹配就能优雅解决,比xsl:choose简洁得多,也更易维护。
核心思路
- 先定义一个按优先级排序的序列,把你需要的顺序
E,J,F,K,G,M,H,L直接写进去 - 收集XML中所有候选节点(
node1和node2)的值 - 从优先级序列里筛选出第一个和候选值匹配的项,就是你要的结果
完整代码示例
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- 定义优先级顺序序列 --> <xsl:variable name="priority-order" select="('E', 'J', 'F', 'K', 'G', 'M', 'H', 'L')"/> <!-- 提取所有候选节点的当前值 --> <xsl:variable name="current-candidates" select="root/node1/text(), root/node2/text()"/> <!-- 取出优先级最高的匹配值 --> <selected-value> <xsl:value-of select="$priority-order[. = $current-candidates][1]"/> </selected-value> </xsl:template> </xsl:stylesheet>
为什么不用正则?
正则表达式在这里完全是舍近求远——你的需求是按固定优先级顺序匹配已知值,序列查找是最直接的解决方案,代码可读性和维护性都比正则高得多。如果用正则,你得写复杂的匹配规则,还得处理优先级顺序,反而增加了复杂度。
和xsl:choose的对比
原来用xsl:choose需要写一堆<xsl:when>分支,每新增一个优先级值就得加分支;而用序列方案,你只需要修改$priority-order这一行即可,扩展性和简洁性都完胜。
内容的提问来源于stack exchange,提问作者pshemek
相关产品推荐
相关产品推荐

