xslt - XSLT 将平面树结构转换为列表
问题描述
我有一个描述 eshop 的树结构的 xml 文件,我只需要获取所有子组的列表。我不知道结构中有多少父/子级别。输入 xml 如下所示:'''
<items>
<item>
<id>1</id>
<parent_id>0</parent_id>
<name>Cars</name>
</item>
<item>
<id>2</id>
<parent_id>0</parent_id>
<name>Tools</name>
</item>
<item>
<id>1001</id>
<parent_id>1</parent_id>
<name>Ford</name>
</item>
<item>
<id>1002</id>
<parent_id>1</parent_id>
<name>Toyota</name>
</item>
<item>
<id>5</id>
<parent_id>2</parent_id>
<name>Axe</name>
</item>
<item>
<id>1150</id>
<parent_id>1001</parent_id>
<name>Ka</name>
</item>
<item>
<id>1151</id>
<parent_id>1001</parent_id>
<name>Raptor</name>
</item>
</export>
'''
输出应该看起来像所有子组的简单列表,结构无关紧要,排序也不重要。'''
<groups>
<root>
<ID>1</ID>
<Child_ID>1001</Child_ID>
<Child_ID>1002</Child_ID>
<Child_ID>1150</Child_ID>
<Child_ID>1151</Child_ID>
</root>
<root>
<ID>2</ID>
<Child_ID>5</Child_ID>
</root>
</groups>
'''
您能告诉我要转换哪些功能或程序吗?
解决方案
这是您可以查看的一种方式:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="child" match="item" use="parent_id"/>
<xsl:template match="items">
<groups>
<xsl:for-each select="item[parent_id=0]">
<group>
<ID>
<xsl:value-of select="id" />
</ID>
<xsl:apply-templates select="key('child', id)"/>
</group>
</xsl:for-each>
</groups>
</xsl:template>
<xsl:template match="item">
<Child_ID>
<xsl:value-of select="id" />
</Child_ID>
<xsl:apply-templates select="key('child', id)"/>
</xsl:template>
</xsl:stylesheet>
使用格式正确的 (!) 输入,例如:
XML
<items>
<item>
<id>1</id>
<parent_id>0</parent_id>
<name>Cars</name>
</item>
<item>
<id>2</id>
<parent_id>0</parent_id>
<name>Tools</name>
</item>
<item>
<id>1001</id>
<parent_id>1</parent_id>
<name>Ford</name>
</item>
<item>
<id>1002</id>
<parent_id>1</parent_id>
<name>Toyota</name>
</item>
<item>
<id>5</id>
<parent_id>2</parent_id>
<name>Axe</name>
</item>
<item>
<id>1150</id>
<parent_id>1001</parent_id>
<name>Ka</name>
</item>
<item>
<id>1151</id>
<parent_id>1001</parent_id>
<name>Raptor</name>
</item>
</items>
这将产生:
结果
<?xml version="1.0" encoding="UTF-8"?>
<groups>
<group>
<ID>1</ID>
<Child_ID>1001</Child_ID>
<Child_ID>1150</Child_ID>
<Child_ID>1151</Child_ID>
<Child_ID>1002</Child_ID>
</group>
<group>
<ID>2</ID>
<Child_ID>5</Child_ID>
</group>
</groups>
推荐阅读
- html - 如何使用动画迭代 vue 组件
- python - 试图生成斐波那契螺旋线但得到黑色图像,卡住了
- amazon-web-services - 我如何确保 NAT 在实例之前启动
- javascript - 如何恢复角度 1 Ng 模型的变化
- algorithm - 从嘈杂的数据中寻找线条
- hadoop - 为什么即使我在集群上添加节点,我的 Hadoop MapReduce 也没有运行得更快?
- go - 解组 XML:根据属性值使用不同的目标类型
- python - pygame显示自动调整大小
- javascript - 在我进行第二次提交后,每当我尝试获取登录页面或注册页面时,我都会收到 404 错误
- django - 如何总结 django 选择中的金额