xslt - 如何使用 XSLT 版本 1 对附近的相同元素进行分组
问题描述
我需要通过使用 XSLT 版本 1 对附近的元素进行分组来将 XML 结构转换为另一个 XML 结构,并将其存储到一个变量中以供以后处理。
我目前的解决方案: https ://xsltfiddle.liberty-development.net/naZXVF1/3
XML
<?xml version="1.0"?>
<Items>
<Parameter>1</Parameter>
<Parameter>2</Parameter>
<Menu>1</Menu>
<Parameter>3</Parameter>
<Parameter>4</Parameter>
<Menu>2</Menu>
<Menu>3</Menu>
<Parameter>5</Parameter>
<Parameter>6</Parameter>
<Parameter>7</Parameter>
<Parameter>8</Parameter>
</Items>
预期结果
<Items>
<Parameters>
<Parameter>1</Parameter>
<Parameter>2</Parameter>
</Parameters>
<Menus>
<Menu>1</Menu>
</Menus>
...
</Items>
解决方案
要么使用兄弟递归,要么使用复杂的键来识别属于一起的元素:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="group" match="*[name(preceding-sibling::*[1]) = name()]"
use="generate-id(preceding-sibling::*[name() = name(current())][name(preceding-sibling::*[1]) != name()][1])"/>
<xsl:template match="Items">
<xsl:copy>
<xsl:apply-templates select="*[name(preceding-sibling::*[1]) != name()]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Items/*">
<xsl:element name="{name()}s">
<xsl:copy-of
select=". | key('group', generate-id())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- python - Sympy 图:绘制具有多个自由变量的函数(python 3.6)
- windows-subsystem-for-linux - 如何在 Windows Subsystem for Linux (WSL) 中启用 Active Directory/LDAP/Kerberos?
- microsoft-dynamics - Dynamics 365:创建自定义 Web 应用程序 UI
- html - 适合没有定义父高度的图像
- r - ggplot 的 aes() 中的属性“color”破坏了我的 ggplot 代码的“geom_line()”部分
- java - 用于查找重复单词“\\b(\\w+)(\\s+\\1\\b)+”的 Java 正则表达式问题
- angular - 带有异步子路由器的命名路由器出口
- python - 有效地平均numpy数组重复行
- javascript - 用D3计算内存中节点的文本长度
- javascript - 单击 Firefox 中的链接时,有没有办法消除蓝色突出显示?