我有一些复杂的XSLT 2.0转换。我试图找出是否有通用的方法来确保不输出空标签。所以......从概念上讲,递归处理的最后阶段是删除所有空标签。我知道这可以通过一个单独的XSLT来完成,它不做任何事情,但是会过滤掉空标签,但我需要将它们全部封装在一起。两阶段处理:不要输出阶段1 XSLT 2.0处理中的空标记
回答
此XSLT 2.0变换示出了如何多遍(在这个例子2通)处理可以做到:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates select="$vPass1/*" mode="non-empty"/>
</xsl:template>
<xsl:template match="text()[xs:integer(.) mod 2 eq 0]"/>
<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>
当此XML文档上施加:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
它在第一遍中创建结果文档(在$vPass1
变量中捕获该文档),其中所有内容均匀的<num>
元素r被删除了内容并且是空的。然后,在第二遍中,以特定模式应用,所有空元素都被删除。
转换的结果是:
<nums>
<num>01</num>
<num>03</num>
<num>05</num>
<num>07</num>
<num>09</num>
</nums>
请注意使用模式,而特殊模式#all
和#current
。
更新: OP现在希望在评论中删除“递归”“没有非空后裔的所有节点”。
这可以使用没有显式递归更简单地实现。只要改变:
<xsl:template match="*[not(node())]" mode="non-empty"/>
到:
<xsl:template match="*[not(descendant::text())]" mode="non-empty"/>
这回答了整个问题,但有一个特定的部分它未命中 - 递归地删除所有空标签...所以我只需要将“* [not(node())]”更改为适当的表达式,这意味着所有没有非空后裔的节点。 – mentics 2010-07-08 09:01:39
@taotree下一次更好地陈述你的问题。 :)我认为最好将这个新要求作为一个单独的问题 - 这也是一个很好的问题。您可以使用空模板的匹配模式:'* [not(descendant :: text())]' – 2010-07-08 12:41:08
@taotree更新了答案以反映您的新需求... :) – 2010-07-08 12:49:47
- 1. 处理RDD的阶段数
- 2. Java预处理阶段
- 3. Clang的不同处理阶段
- 4. 在预处理阶段不断折叠
- 5. 在阶段中处理压缩文件
- 6. 批处理文件变量的阶段
- 7. Jboss的710未能处理阶段POST_MODULE
- 8. 基于Java的阶段处理实现
- 9. 未能处理阶段结构部署
- 10. 无法处理portlet动作阶段
- 11. 未能处理阶段部署结构
- 12. 编译超出预处理器阶段,但在装配前阶段
- 13. YCSB清理阶段
- 14. 如何使用SQLAlchemy处理两阶段提交
- 15. 两阶段提交
- 16. 使用XSLT 2.0的两个阶段转换
- 17. 阶,异常处理,承诺
- 18. 阶梯错误处理
- 19. Spark如何管理阶段?
- 20. 项目阶段[开发]:未处理的消息 - JSF
- 21. 如何在PayPal的多个阶段处理付款?
- 22. JBAS018733:无法处理子部分的阶段PARSE
- 23. 在Mirth的预处理阶段将java对象编组为XML?
- 24. DAG调度程序在使用unionALL时重复处理阶段
- 25. 使用多线程执行Spring批处理阶段
- 26. 只显示消息:项目阶段[开发]:未处理消息
- 27. 预处理阶段和多个文件(基础知识)
- 28. JBoss AS7 - 无法处理部署POST_MODULE阶段
- 29. 如何在小学阶段实施多任务处理?
- 30. 如何将TODO处理整合到maven测试阶段?
很好的问题(+1)。查看我的答案以获得详细解决方案。 – 2010-07-08 01:06:35