根据两个不同的子节点值删除xslt中的重复项

时间:2019-08-20 07:55:55

标签: xml xslt xml-parsing grouping

我正在尝试为以下要求生成XSLT。

我使用了基于sequenceNumber | Type | Value的generate-id和Key,它正在删除Items / Item下的Duplicate。

但是不确定如何才能检查重复的StateType并仅删除同时满足两个条件的Item。

所以我想删除包含基于StateType的重复值的重复值(基本上都在不同的父项下)的

<!-- language: lang-xml -->

    <Containers>
    <Container>
     <DetailContainer>
      <Items>
       <Item>
        <SequenceNumber>1</SequenceNumber>
        <Type>Property</Type>
        <Value>100</Value>
       </Item>
       <Item>
        <SequenceNumber>2</SequenceNumber>
        <Type>Insurance</Type>
        <Value>200</Value>
       </Item>
      </Items>
      <Property>
       <ID>1</ID>
       <Date>2019-03-12</Date>
      </Property>
     <DetailContainer>
     <State>
      <StateType>Current</StateType>
      <ID>1</ID>
      <Date>2019-03-12</Date>
     </State>
    </Container>
    <Container>
     <DetailContainer>
      <Items>
       <Item>
        <SequenceNumber>3</SequenceNumber>
        <Type>Property</Type>
        <Value>600</Value>
       </Item>
       <Item>
        <SequenceNumber>4</SequenceNumber>
        <Type>Insurance</Type>
        <Value>500</Value>
       </Item>
      </Items>
      <Property>
       <ID>2</ID>
       <Date>2017-07-12</Date>
      </Property>
     </DetailContainer>
     <State>
      <StateType>Previous</StateType>
      <ID>1</ID>
      <Date>2019-03-12</Date>
     </State>
    </Container>
    <Container>
     <DetailContainer>
      <Items>
       <Item>
        <SequenceNumber>1</SequenceNumber>
        <Type>Property</Type>
        <Value>100</Value>
       </Item>
       <Item>
        <SequenceNumber>2</SequenceNumber>
        <Type>Insurance</Type>
        <Value>200</Value>
       </Item>
      </Items>
      <Property>
       <ID>2</ID>
       <Date>2019-03-12</Date>
      </Property>
     </DetailContainer>
     <State>
      <StateType>Current</StateType>
      <ID>1</ID>
      <Date>2019-03-12</Date>
     </State>
    </Container>
    </Containers>

预期输出-

    <Containers>
    <Container>
     <DetailContainer>
      <Items>
       <Item>
        <SequenceNumber>1</SequenceNumber>
        <Type>Property</Type>
        <Value>100</Value>
       </Item>
       <Item>
        <SequenceNumber>2</SequenceNumber>
        <Type>Insurance</Type>
        <Value>200</Value>
       </Item>
      </Items>
      <Property>
       <ID>1</ID>
       <Date>2019-03-12</Date>
      </Property>
     </DetailContainer>
     <State>
      <StateType>Current</StateType>
      <ID>1</ID>
      <Date>2019-03-12</Date>
     </State>
    </Container>
    <Container>
     <DetailContainer>
      <Items>
       <Item>
        <SequenceNumber>3</SequenceNumber>
        <Type>Property</Type>
        <Value>600</Value>
       </Item>
       <Item>
        <SequenceNumber>4</SequenceNumber>
        <Type>Insurance</Type>
        <Value>500</Value>
       </Item>
      </Items>
      <Property>
       <ID>2</ID>
       <Date>2017-07-12</Date>
      </Property>
    </DetailContainer>
     <State>
      <StateType>Previous</StateType>
      <ID>1</ID>
      <Date>2019-03-12</Date>
     </State>
    </Container>
    <Container>
     <DetailContainer>
      <Items>

      </Items>
      <Property>
       <ID>2</ID>
       <Date>2019-03-12</Date>
      </Property>
     </DetailContainer>
     <State>
      <StateType>Current</StateType>
      <ID>1</ID>
      <Date>2019-03-12</Date>
     </State>
    </Container>
    </Containers>



------------------------------------------------------------------------

删除重复项的代码-

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:key name="ItemDup" match="Item" use="concat(SequenceNumber,'|',Type,'|', Value)" />

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

<xsl:template match="Item[generate-id(key('ItemDup',concat(SequenceNumber,'|',Type,'|', Value))[1])]">
<xsl:copy>
<xsl:apply-template/>
</xsl:copy>
</xsl:template>

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

1 个答案:

答案 0 :(得分:0)

我认为这就是您要的。您正在尝试根据concat(SequenceNumber,'|', Type,'|', Value)

删除重复项
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.w3.org/TR/xhtml1/strict">


    <xsl:key name="ItemDup" match="Item" use="concat(SequenceNumber,'|', Type,'|', Value)" />

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

    <xsl:template match="Item[generate-id() != generate-id(key('ItemDup', concat(SequenceNumber, '|', Type, '|', Value))[1])]" />

</xsl:stylesheet>