简体   繁体   English

XSLT 1.0 分组父节点由多个子节点分组

[英]XSLT 1.0 Grouping of parent node grouped by multiple child nodes

I'm trying to group based on multiple child nodes and then display the parent nodes grouped by the child nodes.我正在尝试基于多个子节点进行分组,然后显示按子节点分组的父节点。 I've shrunk down the examples a bit, but I hope you get the idea.我已经缩小了一些例子,但我希望你能明白。 Now I've got this working in XSL 2.0, but found out I can only use 1.0 in this application.现在我已经在 XSL 2.0 中使用了它,但发现我只能在这个应用程序中使用 1.0。 I've been reading up on the Muenchian grouping method but can't seem to figure it out.我一直在阅读 Muenchian 分组方法,但似乎无法弄清楚。

This is (part of) the XML:这是(部分)XML:

<Persons>
    <Person PersonID="3987">
        <Desks>
            <Desk Name="10" Active="true">
            </Desk>
            <Desk Name="11" Active="true">
            </Desk>
        </Desks>
    </Person>
    <Person PersonID="3883">
        <Desks>
            <Desk Name="10" Active="true">
            </Desk>
            <Desk Name="11" Active="true">
            </Desk>
            <Desk Name="12" Active="true">
            </Desk>
            <Desk Name="13" Active="true">
            </Desk>
        </Desks>
    </Person>
</Persons>

This is how far I got on the Muenchian grouping method:这是我在 Muenchian 分组方法上的进展:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:key name="persons-per-desk" match="Person" use="Desks/Desk/@Name"/>

    <xsl:template match="Person[generate-id() = generate-id(key('persons-per-desk', Desks/Desk/@Name)[1])]">
        <Desk>
            <xsl:copy-of select="Desks/Desk/@Name" />
            <Person>
                <xsl:copy-of select="key('persons-per-desk', Desks/Desk/@Name)/@PersonID" />
            </Person>
        </Desk>
    </xsl:template>

    <xsl:template match="Person" />
</xsl:stylesheet>

What I hope to expect:我希望期待的是:

<Desk Name="10">
   <Person PersonID="3883"/>
   <Person PersonID="3987"/>
</Desk>
<Desk Name="11">
   <Person PersonID="3883"/>
   <Person PersonID="3987"/>
</Desk>
<Desk Name="12">
   <Person PersonID="3883"/>
</Desk>
<Desk Name="13">
   <Person PersonID="3883"/>
</Desk>

What I get:我得到的:

<Desk Name="11">
   <Person PersonID="3883"/>
</Desk>

Any help would be greatly appreciated.任何帮助将不胜感激。

You are trying to group persons by their desk name/s - but what you need to do is group desks by their name first, then list the persons having a desk in each group:您正在尝试按办公桌名称对人员进行分组 - 但您需要先按名称对办公桌进行分组,然后列出每个组中拥有办公桌的人员:

XSLT 1.0 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="desk-by-name" match="Desk" use="@Name"/>

<xsl:template match="/Persons">
    <Desks>
        <!-- create a grpup for each distinct desk name -->
        <xsl:for-each select="Person/Desks/Desk[generate-id() = generate-id(key('desk-by-name', @Name)[1])]">
            <Desk Name="{@Name}">
                <!-- list the persons having desks in this group -->
                <xsl:for-each select="key('desk-by-name', @Name)/ancestor::Person">
                    <Person PersonID="{@PersonID}"/>
                </xsl:for-each>
            </Desk>
        </xsl:for-each>
    </Desks>
</xsl:template>

</xsl:stylesheet>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM