如何在XSL 1.0中基于XML标签上下文实现条件转换?
XSL 1.0 实现指定XML标签转换的
<xsl:when>表达式方案 原始XML示例
... <tag1>content1</tag1> <tag2/> <tag3>content<b>3</b></tag3> <tag4><ul>....</ul></tag4> ...
转换需求
- 若标签内容无指定列表中的外围标签(如
tag1、tag3),需转换为<p>(标签内容)</p> - 若标签为空(如
tag2),不生成任何内容 - 若标签包含指定列表中的外围标签(如
ul、div,如tag4),直接输出标签内容,无需包裹<p>标签
解决方案(兼容浏览器的XSL 1.0实现)
以下是针对需求编写的XSLT模板及对应的<xsl:when>测试表达式:
<!-- 匹配需要处理的目标标签,可根据实际需求扩展标签列表 --> <xsl:template match="tag1 | tag2 | tag3 | tag4"> <xsl:choose> <!-- 条件1:标签为空,无输出 --> <xsl:when test="not(node())"> <!-- 空操作,不生成任何内容 --> </xsl:when> <!-- 条件2:包含指定外围标签(ul、div),直接输出内容 --> <xsl:when test="ul | div"> <xsl:copy-of select="node()"/> </xsl:when> <!-- 条件3:其他非空情况,用<p>包裹输出 --> <xsl:otherwise> <p> <xsl:copy-of select="node()"/> </p> </xsl:otherwise> </xsl:choose> </xsl:template>
各条件表达式说明
判断标签为空:
test="not(node())"- 检查当前标签是否没有任何子节点(包括文本、元素等所有节点类型),精准匹配空标签如
<tag2/>。
- 检查当前标签是否没有任何子节点(包括文本、元素等所有节点类型),精准匹配空标签如
判断包含指定外围标签:
test="ul | div"- 枚举需要识别的外围标签,检查当前标签的直接子节点中是否存在这些元素。如果需要匹配所有后代节点(而非仅直接子节点),可修改为
test=".//ul | .//div"。
- 枚举需要识别的外围标签,检查当前标签的直接子节点中是否存在这些元素。如果需要匹配所有后代节点(而非仅直接子节点),可修改为
默认非空且无指定标签的情况:通过
<xsl:otherwise>自动匹配,无需额外表达式,覆盖前两个条件未命中的场景。
内容的提问来源于stack exchange,提问作者rhavin
相关产品推荐
相关产品推荐

