首页 > 解决方案 > XSLT 对多个级别进行分组

问题描述

下面是我输入的结构,我在 XSLT 1.0 中需要它。

请尽早帮助解决这个问题。我尝试了 muenchian 分组,但无法理解并使其工作。输入将有多个 AffiliatedAccounts 节点,每个 AffiliatedAccounts 将有一个或多个子 Designations 节点,并且每个 Designations> 依次在其下只有一个 Contacts 节点。我需要根据 ChildAccountNum 字段对 AffiliatedAccounts 进行分组,然后对于每个匹配的 AffiliatedAccounts 需要根据 DesignationId 字段对指定进行分组,然后对于每个指定需要根据 CustomerNum 字段对联系人进行分组。

以下是我的输入:

<root>
    <SPO_ID>MTT017</SPO_ID>
    <AccountNumber>60000061</AccountNumber>
    <AccountName>IEEE Microwave Theory and Techniques Society</AccountName>
    <AffiliatedAccounts>
        <ChildAccountName>abc</ChildAccountName>
        <ChildAccountNum>11</ChildAccountNum>
        <Designations>
            <DesignationName>Chapter</DesignationName>
            <Desn_group>Chapter Officers</Desn_group>
            <DesignationID>1</DesignationID>
            <DesignationAlias/>
            <Contacts>
                <CustomerNum>1111</CustomerNum>
                <FirstName>newtest</FirstName>
                <LastName>M</LastName>
            </Contacts>
        </Designations>
    </AffiliatedAccounts>
    <AffiliatedAccounts>
        <ChildAccountName>abc</ChildAccountName>
        <ChildAccountNum>11</ChildAccountNum>
        <Designations>
            <DesignationName>Chapter</DesignationName>
            <Desn_group>Chapter Officers</Desn_group>
            <DesignationID>1</DesignationID>
            <DesignationAlias/>
            <Contacts>
                <Contacts>
                    <CustomerNum>2222</CustomerNum>
                    <FirstName>test</FirstName>
                    <LastName>M</LastName>
                </Contacts>
            </Designations>
        </AffiliatedAccounts>
        <AffiliatedAccounts>
            <ChildAccountName>Test</ChildAccountName>
            <ChildAccountNum>12</ChildAccountNum>
            <Designations>
                <DesignationName>Chapter</DesignationName>
                <Desn_group>Chapter Officers</Desn_group>
                <DesignationID>2</DesignationID>
                <DesignationAlias/>
                <Contacts>
                    <CustomerNum>3333</CustomerNum>
                    <FirstName>newtest</FirstName>
                    <LastName>M</LastName>
                </Contacts>
            </Designations>
        </AffiliatedAccounts>
        <AffiliatedAccounts>
            <ChildAccountName>Test</ChildAccountName>
            <ChildAccountNum>12</ChildAccountNum>
            <Designations>
                <DesignationName>Chapter</DesignationName>
                <Desn_group>Chapter Officers</Desn_group>
                <DesignationID>3</DesignationID>
                <DesignationAlias/>
                <Contacts>
                    <CustomerNum>4444</CustomerNum>
                    <FirstName>newtest</FirstName>**strong text**
                    <LastName>M</LastName>
                </Contacts>
            </Designations>
        </AffiliatedAccounts>
    </root>

以下是预期输出:

<root>
    <SPO_ID>MTT017</SPO_ID>
    <AccountNumber>60000061</AccountNumber>
    <AccountName>IEEE Microwave Theory and Techniques Society</AccountName>
    <AffiliatedAccounts>
        <ChildAccountName>abc</ChildAccountName>
        <ChildAccountNum>11</ChildAccountNum>
        <Designations>
            <DesignationName>Chapter</DesignationName>
            <Desn_group>Chapter Officers</Desn_group>
            <DesignationID>1</DesignationID>
            <DesignationAlias/>
            <Contacts>
                <CustomerNum>1111</CustomerNum>
                <FirstName>newtest</FirstName>
                <LastName>M</LastName>
            </Contacts>
            <Contacts>
                <CustomerNum>2222</CustomerNum>
                <FirstName>test</FirstName>
                <LastName>M</LastName>
            </Contacts>
        </Designations>
    </AffiliatedAccounts>
    <AffiliatedAccounts>
        <ChildAccountName>Test</ChildAccountName>
        <ChildAccountNum>12</ChildAccountNum>
        <Designations>
            <DesignationName>Chapter</DesignationName>
            <Desn_group>Chapter Officers</Desn_group>
            <DesignationID>2</DesignationID>
            <DesignationAlias/>
            <Contacts>
                <CustomerNum>3333</CustomerNum>
                <FirstName>newtest</FirstName>
                <LastName>M</LastName>
            </Contacts>
        </Designations>
        <Designations>
            <DesignationName>Chapter</DesignationName>
            <Desn_group>Chapter Officers</Desn_group>
            <DesignationID>3</DesignationID>
            <DesignationAlias/>
            <Contacts>
                <CustomerNum>4444</CustomerNum>
                <FirstName>newtest</FirstName>
                <LastName>M</LastName>
            </Contacts>
        </Designations>
    </AffiliatedAccounts>
</root>

下面是我尝试过的代码,但我不知道如何使用 menchuian 分组,这只是一次尝试,它没有正确分组名称和联系人节点。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:UUIDUserFunction="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.stages.functions.UUIDUserFunction" xmlns:IsUserInGroupFunction="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.stages.functions.IsUserInGroupFunction" xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" xmlns:IsUserInRoleFunction="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.stages.functions.IsUserInRoleFunction" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" xmlns:DVMFunctions="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.functions.dvm.DVMFunctions" xmlns:oracle-xsl-mapper="http://www.oracle.com/xsl/mapper/schemas" xmlns:oraxsl="http://www.oracle.com/XSL/Transform/java" xmlns:RuntimeTypeConversionFunctions="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.stages.functions.RuntimeTypeConversionFunctions" xmlns:XrefFunctions="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.functions.xref.XrefFunctions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:BasicCredentialsUserFunction="http://www.oracle.com/XSL/Transform/java/com.bea.wli.sb.stages.functions.BasicCredentialsUserFunction" exclude-result-prefixes=" xsd oracle-xsl-mapper xsi xsl UUIDUserFunction IsUserInGroupFunction oraext IsUserInRoleFunction xp20 DVMFunctions oraxsl RuntimeTypeConversionFunctions XrefFunctions BasicCredentialsUserFunction">
  <!-- <oracle-xsl-mapper:schema> -->
      <!--SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY.-->
   <!--   <oracle-xsl-mapper:mapSources>
         <oracle-xsl-mapper:source type="XSD">
            <oracle-xsl-mapper:schema location="../Schema/GetSocietyOfficersResponse.xsd"/>
            <oracle-xsl-mapper:rootElement name="root" namespace=""/>
         </oracle-xsl-mapper:source>
      </oracle-xsl-mapper:mapSources>
      <oracle-xsl-mapper:mapTargets>
         <oracle-xsl-mapper:target type="XSD">
            <oracle-xsl-mapper:schema location="../Schema/GetSocietyOfficersResponse.xsd"/>
            <oracle-xsl-mapper:rootElement name="root" namespace=""/>
         </oracle-xsl-mapper:target>
      </oracle-xsl-mapper:mapTargets> -->
      <!--GENERATED BY ORACLE XSL MAPPER 12.2.1.0.0(XSLT Build 151013.0700.0085) AT [THU JUL 09 22:46:14 EDT 2020].-->
  <!-- </oracle-xsl-mapper:schema> -->
   <!--User Editing allowed BELOW this line - DO NOT DELETE THIS LINE-->
  <!-- <xsl:template match="/">
      <root/>
   </xsl:template> -->
   <xsl:output method="xml" indent="yes" />

  <xsl:key name="acct" match="AffiliatedAccounts" use="ChildAccountNum" />
  <xsl:key name="desig" match="Designations" use="concat(../ChildAccountNum, '|', DesignationID)" />

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="AffiliatedAccounts[generate-id() = generate-id(key('acct', ChildAccountNum)[1])]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="AffiliatedAccounts">
    <xsl:copy>
     <xsl:apply-templates select="node()|@*" />
      <xsl:apply-templates select="key('acct', ChildAccountNum)/Designations[generate-id() = generate-id(key('desig', concat(../ChildAccountNum, '|', DesignationID))[1])]" />
    </xsl:copy>
  </xsl:template>

   <xsl:template match="Designations">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
      <xsl:apply-templates select="key('desig', concat(../ChildAccountNum, '|', DesignationID))/Contacts" />
    </xsl:copy>
  </xsl:template> 
</xsl:stylesheet>

标签: xsltxslt-1.0xslt-groupingmuenchian-grouping

解决方案


推荐阅读