使用 XSLT 对重复的 XML 数据进行分组 [英] Use XSLT to group repetitive XML data

查看:30
本文介绍了使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆