根据元素标签为空去除重复节点集
Remove duplicate node set based on element tag is empty
***This is my input xml coming from source.***
<?xml version="1.0" encoding="UTF-8" ?>
<exampleElement xmlns="http://www.example.org">
<element1>
<Id>123</Id>
<Name>Imag</Name>
<Status>active</Status>
<EndDate/>
</element1>
<element1>
<Id>888</Id>
<Name>Preci</Name>
<Status>active</Status>
<EndDate/>
</element1>
<element1>
<Id>123</Id>
<Name>Imag</Name>
<Status>terminated</Status>
<EndDate>2016-12-10</EndDate>
</element1>
<element1>
<Id>143</Id>
<Name>kilok</Name>
<Status>terminated</Status>
<EndDate>2016-11-10</EndDate>
</element1>
</exampleElement>
在上面的输入数据中,有两个不同的重复集 value.Where ID=123 元素节点有两条记录,有 EndDate 值和没有 EndDate。
**I want out put in this below format where one record set
from duplicates with EndDate tag empty.**
<?xml version = '1.0' encoding = 'UTF-8'?>
<ns1:exampleElement xmlns:ns1="http://www.example.org">
<ns1:element1>
<ns1:Id>888</ns1:Id>
<ns1:Name>Preci</ns1:Name>
<ns1:Status>active</ns1:Status>
<ns1:EndDate/>
</ns1:element1>
<ns1:element1>
<ns1:Id>123</ns1:Id>
<ns1:Name>Imag</ns1:Name>
<ns1:Status>active</ns1:Status>
<ns1:EndDate/>
</ns1:element1>
<ns1:element1>
<ns1:Id>143</ns1:Id>
<ns1:Name>Kilok</ns1:Name>
<ns1:Status>terminated</ns1:Status>
<ns1:EndDate>2016-11-10</ns1:EndDate>
</ns1:element1>
</ns1:exampleElement>
请在我的 xslt 下方找到唯一记录,但我想根据值获取唯一记录。
<xsl:template match="/">
<ns1:exampleElement>
<xsl:for-each select="/ns1:exampleElement/ns1:element1[not(ns1:Id=following::ns1:Id)]">
<ns1:element1>
<ns1:Id>
<xsl:value-of select="./ns1:Id"/>
</ns1:Id>
<ns1:Name>
<xsl:value-of select="./ns1:Name"/>
</ns1:Name>
<ns1:Status>
<xsl:value-of select="./ns1:Status"/>
</ns1:Status>
<ns1:EndDate>
<xsl:value-of select="./ns1:EndDate"/>
</ns1:EndDate>
</ns1:element1>
</xsl:for-each>
</ns1:exampleElement>
因为源系统将接收第一组中的用户活动记录和第二组中的终止记录,但我们只需要将活动记录转发到目标 system.Please 对此有帮助。
您在评论中得到了 link 一篇关于 Muenchian Grouping 的文章,其中解释了要采取的方法。它涉及首先定义一个键来匹配要分组的元素(其中 ns1
是绑定到命名空间 URI 的命名空间前缀)
<xsl:key name="elements" match="ns1:element1" use="ns1:Id" />
然后,要获得不同的元素(或者更确切地说,Id
的每个可能值的元素的第一次出现),您可以这样做...
<xsl:for-each select="ns1:element1[generate-id() = generate-id(key('elements', ns1:Id)[1])]" />
要访问组中的所有元素,请执行此操作..
<xsl:for-each select="key('elements', ns1:Id)">
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.example.org">
<xsl:key name="elements" match="ns1:element1" use="ns1:Id" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:copy>
<xsl:for-each select="*/ns1:element1[generate-id() = generate-id(key('elements', ns1:Id)[1])]">
<xsl:for-each select="key('elements', ns1:Id)">
<xsl:sort select="ns1:EndDate" />
<xsl:if test="position() = 1">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果你真的想输出带有 ns1:
前缀的 XML(虽然它真的不应该有什么区别),试试这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.example.org">
<xsl:key name="elements" match="ns1:element1" use="ns1:Id" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<ns1:exampleElement>
<xsl:for-each select="*/ns1:element1[generate-id() = generate-id(key('elements', ns1:Id)[1])]">
<xsl:for-each select="key('elements', ns1:Id)">
<xsl:sort select="ns1:EndDate" />
<xsl:if test="position() = 1">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</ns1:exampleElement>
</xsl:template>
<xsl:template match="*" priority="2">
<xsl:element name="ns1:{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
***This is my input xml coming from source.***
<?xml version="1.0" encoding="UTF-8" ?>
<exampleElement xmlns="http://www.example.org">
<element1>
<Id>123</Id>
<Name>Imag</Name>
<Status>active</Status>
<EndDate/>
</element1>
<element1>
<Id>888</Id>
<Name>Preci</Name>
<Status>active</Status>
<EndDate/>
</element1>
<element1>
<Id>123</Id>
<Name>Imag</Name>
<Status>terminated</Status>
<EndDate>2016-12-10</EndDate>
</element1>
<element1>
<Id>143</Id>
<Name>kilok</Name>
<Status>terminated</Status>
<EndDate>2016-11-10</EndDate>
</element1>
</exampleElement>
在上面的输入数据中,有两个不同的重复集 value.Where ID=123 元素节点有两条记录,有 EndDate 值和没有 EndDate。
**I want out put in this below format where one record set
from duplicates with EndDate tag empty.**
<?xml version = '1.0' encoding = 'UTF-8'?>
<ns1:exampleElement xmlns:ns1="http://www.example.org">
<ns1:element1>
<ns1:Id>888</ns1:Id>
<ns1:Name>Preci</ns1:Name>
<ns1:Status>active</ns1:Status>
<ns1:EndDate/>
</ns1:element1>
<ns1:element1>
<ns1:Id>123</ns1:Id>
<ns1:Name>Imag</ns1:Name>
<ns1:Status>active</ns1:Status>
<ns1:EndDate/>
</ns1:element1>
<ns1:element1>
<ns1:Id>143</ns1:Id>
<ns1:Name>Kilok</ns1:Name>
<ns1:Status>terminated</ns1:Status>
<ns1:EndDate>2016-11-10</ns1:EndDate>
</ns1:element1>
</ns1:exampleElement>
请在我的 xslt 下方找到唯一记录,但我想根据值获取唯一记录。
<xsl:template match="/">
<ns1:exampleElement>
<xsl:for-each select="/ns1:exampleElement/ns1:element1[not(ns1:Id=following::ns1:Id)]">
<ns1:element1>
<ns1:Id>
<xsl:value-of select="./ns1:Id"/>
</ns1:Id>
<ns1:Name>
<xsl:value-of select="./ns1:Name"/>
</ns1:Name>
<ns1:Status>
<xsl:value-of select="./ns1:Status"/>
</ns1:Status>
<ns1:EndDate>
<xsl:value-of select="./ns1:EndDate"/>
</ns1:EndDate>
</ns1:element1>
</xsl:for-each>
</ns1:exampleElement>
因为源系统将接收第一组中的用户活动记录和第二组中的终止记录,但我们只需要将活动记录转发到目标 system.Please 对此有帮助。
您在评论中得到了 link 一篇关于 Muenchian Grouping 的文章,其中解释了要采取的方法。它涉及首先定义一个键来匹配要分组的元素(其中 ns1
是绑定到命名空间 URI 的命名空间前缀)
<xsl:key name="elements" match="ns1:element1" use="ns1:Id" />
然后,要获得不同的元素(或者更确切地说,Id
的每个可能值的元素的第一次出现),您可以这样做...
<xsl:for-each select="ns1:element1[generate-id() = generate-id(key('elements', ns1:Id)[1])]" />
要访问组中的所有元素,请执行此操作..
<xsl:for-each select="key('elements', ns1:Id)">
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.example.org">
<xsl:key name="elements" match="ns1:element1" use="ns1:Id" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:copy>
<xsl:for-each select="*/ns1:element1[generate-id() = generate-id(key('elements', ns1:Id)[1])]">
<xsl:for-each select="key('elements', ns1:Id)">
<xsl:sort select="ns1:EndDate" />
<xsl:if test="position() = 1">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果你真的想输出带有 ns1:
前缀的 XML(虽然它真的不应该有什么区别),试试这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.example.org">
<xsl:key name="elements" match="ns1:element1" use="ns1:Id" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<ns1:exampleElement>
<xsl:for-each select="*/ns1:element1[generate-id() = generate-id(key('elements', ns1:Id)[1])]">
<xsl:for-each select="key('elements', ns1:Id)">
<xsl:sort select="ns1:EndDate" />
<xsl:if test="position() = 1">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</ns1:exampleElement>
</xsl:template>
<xsl:template match="*" priority="2">
<xsl:element name="ns1:{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>