xslt - xsl 2.0 基于不同元素的多重嵌套
问题描述
如何使用 xsl 2.0 基于 level1 (outer)、level2(middle)、level3(inner) 多重嵌套以下 xml?
<rootNode>
<fruits>
<fruit>
<level1>4</level1>
<level2/>
<level3/>
<kind>orange</kind>
<size>big</size>
<origin>california</origin>
</fruit>
<fruit>
<level1>4</level1>
<level2>2</level2>
<level3/>
<kind>lemon</kind>
<size>small</size>
<origin>florida</origin>
</fruit>
<fruit>
<level1>4</level1>
<level2>2</level2>
<level3>1</level3>
<kind>pineapple</kind>
<size>normal</size>
<origin>oregon</origin>
</fruit>
<fruit>
<level1>5</level1>
<level2>2</level2>
<level3/>
<kind>pineapple</kind>
<size>normal</size>
<origin>oregon</origin>
</fruit>
<fruit>
<level1>5</level1>
<level2>1</level2>
<level3/>
<kind>peer</kind>
<size>big</size>
<origin>ohio</origin>
</fruit>
</fruits>
</rootNode>
我可以使用以下 xslt 为 level1 执行此操作
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/rootNode/fruits">
<xsl:for-each-group select="fruit" group-by="level1">
<level1 name="{current-grouping-key()}">
<xsl:copy-of select="current-group()"/>
</level1>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是,使用它的输出并为 lavel2 再次执行它是行不通的。递归函数?怎么写?
解决方案
正如你的标题所说,你需要嵌套两个xsl:for-each-group
指令,一个在另一个里面:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/rootNode">
<xsl:for-each-group select="fruits/fruit" group-by="level1">
<level1 name="{current-grouping-key()}">
<xsl:for-each-group select="current-group()" group-by="level2">
<level2 name="{current-grouping-key()}">
<xsl:copy-of select="current-group()"/>
</level2>
</level1>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- javascript - 无法保存多对多关系模型的属性(猫鼬)
- google-apps-script - 为电子表格中的每个产品创建一个 TextItem 并将该项目的标题设置为“(产品名称)(剩余:(剩余数量))”
- c# - 从 C# 中以 SYSTEM 启动的程序打开文件夹
- php - 在 Ajax 响应上添加 if else 函数
- android - 更新基本导航抽屉活动的参数
- typescript - 在Vue(打字稿)中指定数据值的类型
- html - 有没有办法让 CSS 标签接受用户输入
- python - 没有参数的函数不起作用。但为什么?
- python - 在数据框字符串列中查找单词列表
- c# - 需要什么查询来确定一组字符串中的任何一个是否包含在还包含多个值的列中?