尝试在 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 还是新手,任何线索都将不胜感激。
看来你想要一张支票
<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>