xslt - 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>
解决方案
推荐阅读
- swift - 滚动 TableView (Swift) 时单元格消失
- node.js - 使用 Jest 和 mock-fs 测试 async fs.readfile 会导致测试超时,即使超时 30 秒
- python - 使用 `python-xlib` 模拟 `xprop` 和 `wmctrl` 用于窗口 `above` 的函数
- html5-video - 分块 WebM - 最小尺寸是多少?
- google-apps-script - Google Scripts:制作一个按钮,将单元格中的时间迭代一小时
- javascript - 条件不适用于 DragEnd 事件
- python - 使用复合键查找条形图
- kubernetes - Helm 将额外的元素传递给数组
- windows - 在 Win32 API 中限制文本框键盘输入
- python - 在不和谐机器人中实现图像搜索