我正在尝试为以下要求生成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>
答案 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>