XSLT 2.0 转换:按值和元素对节点进行分组

问题描述 投票:0回答:1

尝试在 xslt 2.0 中转换 xml 并按值和元素对节点进行分组

我有一个输入 xml 如下:

<?xml version='1.0' encoding='UTF-8'?>
<Applications>
    <Application>
        <applicationId>280</applicationId>
        <cust_IDCheckIDCollation>
            <Option>
                <id>197249</id>
            </Option>
        </cust_IDCheckIDCollation>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>292</applicationId>
        <cust_IDCheckIDCollation>
            <Option>
                <id>197249</id>
            </Option>
        </cust_IDCheckIDCollation>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>280</applicationId>
        <cust_OnlineReferenceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_OnlineReferenceCheck>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>292</applicationId>
        <cust_OnlineReferenceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_OnlineReferenceCheck>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>280</applicationId>
        <cust_AustralianWorkRights>
            <Option>
                <id>197250</id>
            </Option>
        </cust_AustralianWorkRights>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>292</applicationId>
        <cust_AustralianWorkRights>
            <Option>
                <id>197250</id>
            </Option>
        </cust_AustralianWorkRights>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>280</applicationId>
        <cust_NationalPoliceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_NationalPoliceCheck>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197280</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
    <Application>
        <applicationId>292</applicationId>
        <cust_NationalPoliceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_NationalPoliceCheck>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197276</id>
            </Option>
        </cust_overallduedilligencestatus>
    </Application>
</Applications>  

我需要按 applicationId 将其分组,然后按元素名称对其进行子分组以删除重复元素。另外,对于 cust_overallduediligencestatus 节点,我需要检查它们中是否有任何一个包含 197280 值,如果包含,则目标 xml 中应该包含该值。因此上述输入的预期输出应该低于。

预期产出

<Applications>
    <Application>
        <applicationId>280</applicationId>
        <cust_IDCheckIDCollation>
            <Option>
                <id>197249</id>
            </Option>
        </cust_IDCheckIDCollation>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197280</id>
            </Option>
        </cust_overallduedilligencestatus>
        <cust_OnlineReferenceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_OnlineReferenceCheck>
        <cust_AustralianWorkRights>
            <Option>
                <id>197250</id>
            </Option>
        </cust_AustralianWorkRights>
        <cust_NationalPoliceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_NationalPoliceCheck>
    </Application>
    <Application>
        <applicationId>292</applicationId>
        <cust_IDCheckIDCollation>
            <Option>
                <id>197249</id>
            </Option>
        </cust_IDCheckIDCollation>
        <cust_overallduedilligencestatus>
            <Option>
                <id>197280</id>
            </Option>
        </cust_overallduedilligencestatus>
        <cust_OnlineReferenceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_OnlineReferenceCheck>
        <cust_AustralianWorkRights>
            <Option>
                <id>197250</id>
            </Option>
        </cust_AustralianWorkRights>
        <cust_NationalPoliceCheck>
            <Option>
                <id>197249</id>
            </Option>
        </cust_NationalPoliceCheck>
    </Application>
    <Applications>

下面是xslt,我正在使用。它将值和元素很好地分组。但是,我无法搜索 cust_overallduediligencestatus 的 197280 值并包含该值(如果存在)。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Applications">
    <xsl:copy>
        <xsl:for-each-group select="Application" group-by="applicationId">
            <xsl:copy>
                <xsl:copy-of select="applicationId"/>
                <xsl:for-each-group select="current-group()/(* except applicationId)" group-by="name()">
                    <xsl:copy-of select="current-group()[1]"/>
                </xsl:for-each-group>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>   
</xsl:stylesheet>

我对 xslt 还是新手,任何线索都将不胜感激。

xslt xslt-2.0 xslt-grouping
1个回答
0
投票

看来你想要一张支票

<xsl:template match="/Applications">
    <xsl:copy>
        <xsl:for-each-group select="Application" group-by="applicationId">
            <xsl:copy>
                <xsl:copy-of select="applicationId"/>
                <xsl:for-each-group select="current-group()/(* except applicationId)" group-by="name()">
                    <xsl:copy-of select="if (current-grouping-key() = 'cust_overallduedilligencestatus' and current-group()/Option/id = 197280) then current-group()[Option/id = 197280] else current-group()[1]"/>
                </xsl:for-each-group>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template> 
© www.soinside.com 2019 - 2024. All rights reserved.