html - XSLT - 当前节点等于前一个节点时删除节点
问题描述
我需要为包含以下格式的 xml 编写 XSLT。
<books>
<book>
<a>name</a>
<a>name</a>
<b>name</b>
<b>name</b>
</book>
</books>
在某些情况下,我需要消除重复的子节点。
- 只有当(当前节点 == 前一个节点)才应该将其删除。
即..如果前一个节点(元素)是<a>
并且当前节点(元素)也是<a>
,那么应该删除一个节点。
上面的输出是,
`<a>name</a>`
`<b>name</b>`
请帮我这样做。
解决方案
在 XSLT 2 或 3 中,您可以通过节点名称轻松地将相邻的兄弟元素分组,for-each-group select="*" group-adjacent="node-name()"
并简单地输出每个组中的第一项(等于上下文项.
):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="book">
<xsl:copy>
<xsl:for-each-group select="*" group-adjacent="node-name()">
<xsl:copy-of select="."/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- sql - 如何找到一列的最后一个非空值并递归地找到另一列的总和值
- java - 如何为不同数据类型的不同类实现接口
- python - 需要 Python 正则表达式多个模式匹配和反模式匹配
- python - Flask Route 将 Args 传递给 Celery 任务
- wso2 - WSO2 Enterprise Integrator 数据库迁移
- angular - 我无法让路线在 Angular 中工作,请指教
- virtual-machine - 我们可以使用 libvert 单步 QEMU
- javascript - 时刻获取时间段 AM//PM 本地化
- .net - 如何为 .NET Standard 创建“NuGet 包管理项目”?
- ruby-on-rails - Rails:收集连接表出现在两个查询中的记录