使用 XSLT 对重复的 XML 数据进行分组 [英] Use XSLT to group repetitive XML data
本文介绍了使用 XSLT 对重复的 XML 数据进行分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个 XML,需要将其转换为更好的项目分组.
I have an XML that needs to be transformed into a better grouping of the items.
- 需要对物品进行计数.
- 我不知道会有多少只狗在列表中.
- 我可能不知道有多少关于狗会有.在这个例子中有三个,但它可能是任何数字.如果这不能灵活,那么固定数量就可以了.
最好是 XSLT 1.0
Preferrably XSLT 1.0
这可能吗?
我需要从这里开始:
<table name = "dogs">
<fields>
<field name = "name" value = "dog1"></field>
<field name = "age" value = "2"></field>
<field name = "haircolor" value = "brown"></field>
<field name = "name" value = "dog2"></field>
<field name = "age" value = "10"></field>
<field name = "haircolor" value = "white"></field>
<field name = "name" value = "dog3"></field>
<field name = "age" value = "7"></field>
<field name = "haircolor" value = "black"></field>
<field name = "name" value = "dog4"></field>
<field name = "age" value = "4"></field>
<field name = "haircolor" value = "brown"></field>
</fields>
</table>
为此:
<dogs count = "4">
<dog>
<name>dog1</name>
<age>2</age>
<haircolor>brown</haircolor>
</dog>
<dog>
<name>dog2</name>
<age>10</age>
<haircolor>white</haircolor>
</dog>
<dog>
<name>dog3</name>
<age>7</age>
<haircolor>black</haircolor>
</dog>
<dog>
<name>dog4</name>
<age>4</age>
<haircolor>brown</haircolor>
</dog>
</dogs>
推荐答案
假设每组字段以名称开头:.
Assuming each group of fields starts with a name: .
XSLT 1.0
<?xml version="1.0" encoding="UTF-8"?>
<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="fields-by-lead" match="field[@name!='name']" use="generate-id(preceding-sibling::field[@name='name'][1])" />
<xsl:template match="/table">
<xsl:variable name="names" select="fields/field[@name='name']" />
<dogs count="{count($names)}">
<xsl:for-each select="$names">
<dog>
<name><xsl:value-of select="@value"/></name>
<xsl:for-each select="key('fields-by-lead', generate-id())">
<xsl:element name="{@name}">
<xsl:value-of select="@value"/>
</xsl:element>
</xsl:for-each>
</dog>
</xsl:for-each>
</dogs>
</xsl:template>
</xsl:stylesheet>
<小时>
以下修改为名称与第一个字段名称匹配的每个字段启动一个新组.
The following modification starts a new group for every field whose name matches the name of the very first field.
XSLT 1.0
<?xml version="1.0" encoding="UTF-8"?>
<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="fields-by-lead" match="field" use="generate-id(preceding-sibling::field[@name=/table/fields/field[1]/@name][1])" />
<xsl:template match="/table">
<xsl:variable name="lead-label" select="/table/fields/field[1]/@name" />
<xsl:variable name="leads" select="fields/field[@name=$lead-label]" />
<dogs count="{count($leads)}">
<xsl:for-each select="$leads">
<dog>
<xsl:for-each select=". | key('fields-by-lead', generate-id())[@name!=$lead-label]">
<xsl:element name="{@name}">
<xsl:value-of select="@value"/>
</xsl:element>
</xsl:for-each>
</dog>
</xsl:for-each>
</dogs>
</xsl:template>
</xsl:stylesheet>
这篇关于使用 XSLT 对重复的 XML 数据进行分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文