使用XLST从XML文件中删除重复记录

雷夫

我有以下XML文件:

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
    xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
    xmlns:rs='urn:schemas-microsoft-com:rowset'
    xmlns:z='RowsetSchema'>
<s:schema id='RowsetSchema'>
    <s:elementType name='row' content='eltOnly'>
        <s:attributeType name='iBookID' rs:number='1' rs:writeunknown='true'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='vchISBN' rs:number='2' rs:writeunknown='true'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='25' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='vchEAN' rs:number='3' rs:writeunknown='true'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='25' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='vchLCCN' rs:number='4' rs:writeunknown='true'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='25' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='iNumPages' rs:number='5' rs:writeunknown='true'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='vchPublisherName' rs:number='6' rs:writeunknown='true'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='75' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='iYearPublished' rs:number='7' rs:writeunknown='true'>
            <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true' rs:maybenull='false'/>
        </s:attributeType>
        <s:attributeType name='tiPrimaryISBN_Flag' rs:number='8' rs:nullable='true' rs:writeunknown='true'>
            <s:datatype dt:type='ui1' dt:maxLength='1' rs:precision='3' rs:fixedlength='true'/>
        </s:attributeType>
        <s:attributeType name='vchDivision' rs:number='9' rs:nullable='true' rs:writeunknown='true'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='10'/>
        </s:attributeType>
        <s:extends type='rs:rowbase'/>
    </s:elementType>
</s:schema>
<rs:data>
    <z:row iBookID='3093' vchISBN='978-0-329-05967-5' vchEAN='9780329059675' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='1987' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-329-05967-5' vchEAN='9780329059675' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='1987' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-329-47925-1' vchEAN='9780329479251' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='2006' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-329-47925-1' vchEAN='9780329479251' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='2006' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-329-47925-1' vchEAN='9780329479251' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='2006' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-7587-0171-8' vchEAN='9780758701718' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='1987' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-7587-0171-8' vchEAN='9780758701718' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='1987' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
    <z:row iBookID='3093' vchISBN='978-0-7587-0171-8' vchEAN='9780758701718' vchLCCN='Not Available' iNumPages='317'
         vchPublisherName='FollettBound' iYearPublished='1987' tiPrimaryISBN_Flag='0' vchDivision='PLATALS'/>
</rs:data>
</xml>

我一直在尝试从中删除重复的记录(行),但现在没有运气。我已经在线阅读并尝试了几个示例,但略有不足。如果有人可以帮助我更正xsl中的语法,我将不胜感激。

这是我的xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

   <xsl:template match="z:row" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="RowsetSchema" >
        <xsl:if test="not(following-sibling::z:row)">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

我收到的结果只是正在写入的最后一个记录(行)与我期望的3个记录(行)。

<xml xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
     xmlns:rs="urn:schemas-microsoft-com:rowset"
     xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
     xmlns:z="RowsetSchema">
   <s:schema id="RowsetSchema">
      <s:elementType content="eltOnly" name="row">
         <s:attributeType name="iBookID" rs:number="1" rs:writeunknown="true">
            <s:datatype dt:maxLength="4" dt:type="int" rs:fixedlength="true" rs:maybenull="false"
                        rs:precision="10"/>
         </s:attributeType>
         <s:attributeType name="vchISBN" rs:number="2" rs:writeunknown="true">
            <s:datatype dt:maxLength="25" dt:type="string" rs:dbtype="str" rs:maybenull="false"/>
         </s:attributeType>
         <s:attributeType name="vchEAN" rs:number="3" rs:writeunknown="true">
            <s:datatype dt:maxLength="25" dt:type="string" rs:dbtype="str" rs:maybenull="false"/>
         </s:attributeType>
         <s:attributeType name="vchLCCN" rs:number="4" rs:writeunknown="true">
            <s:datatype dt:maxLength="25" dt:type="string" rs:dbtype="str" rs:maybenull="false"/>
         </s:attributeType>
         <s:attributeType name="iNumPages" rs:number="5" rs:writeunknown="true">
            <s:datatype dt:maxLength="4" dt:type="int" rs:fixedlength="true" rs:maybenull="false"
                        rs:precision="10"/>
         </s:attributeType>
         <s:attributeType name="vchPublisherName" rs:number="6" rs:writeunknown="true">
            <s:datatype dt:maxLength="75" dt:type="string" rs:dbtype="str" rs:maybenull="false"/>
         </s:attributeType>
         <s:attributeType name="iYearPublished" rs:number="7" rs:writeunknown="true">
            <s:datatype dt:maxLength="4" dt:type="int" rs:fixedlength="true" rs:maybenull="false"
                        rs:precision="10"/>
         </s:attributeType>
         <s:attributeType name="tiPrimaryISBN_Flag" rs:nullable="true" rs:number="8"
                          rs:writeunknown="true">
            <s:datatype dt:maxLength="1" dt:type="ui1" rs:fixedlength="true" rs:precision="3"/>
         </s:attributeType>
         <s:attributeType name="vchDivision" rs:nullable="true" rs:number="9" rs:writeunknown="true">
            <s:datatype dt:maxLength="10" dt:type="string" rs:dbtype="str"/>
         </s:attributeType>
         <s:extends type="rs:rowbase"/>
      </s:elementType>
   </s:schema>
   <rs:data>
      <z:row iBookID="3093" iNumPages="317" iYearPublished="1987" tiPrimaryISBN_Flag="0"
             vchDivision="PLATALS"
             vchEAN="9780758701718"
             vchISBN="978-0-7587-0171-8"
             vchLCCN="Not Available"
             vchPublisherName="FollettBound"/>
   </rs:data>
</xml>

同样,我只想消除新xml中的重复记录(行)。我感谢大家可能提出的任何建议。我正在使用以下在线工具来测试我的xsl- http://xslttest.appspot.com/

Shnugo

您可以使用以下键进行尝试:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="DistinctEAN" match="z:row" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="RowsetSchema" use="@vchEAN" />

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

   <xsl:template match="z:row" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="RowsetSchema" >
      <xsl:copy-of select=".[generate-id()=generate-id(key('DistinctEAN' , @vchEAN )[1])]"/>
    </xsl:template>
</xsl:stylesheet>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

删除 vCard 文件中的重复记录

来自分类Dev

使用XLST从xml文件中删除元素

来自分类Dev

使用python合并数据并删除许多JSON文件中的重复记录

来自分类Dev

使用分组依据从Mysql表中删除重复记录

来自分类Dev

使用SQL删除表中的重复记录

来自分类Dev

删除重复记录

来自分类Dev

删除SQL中的重复记录

来自分类Dev

如何删除SQL中的重复记录?

来自分类Dev

如何使用linq删除重复记录?

来自分类Dev

如何使用linq删除重复记录?

来自分类Dev

Oracle SQL查询:从表中删除最旧的重复记录

来自分类Dev

从大型Laravel集合中删除重复记录

来自分类Dev

如何快速删除mysql中的重复记录

来自分类Dev

如何从mongodb数据库中删除重复记录

来自分类Dev

从 SQL Server 中的视图中删除重复记录

来自分类Dev

需要查找并删除表中的重复记录

来自分类Dev

如何从对象数组中删除重复记录?

来自分类Dev

sql使用联接时删除重复记录

来自分类Dev

sql使用联接时删除重复记录

来自分类Dev

使用最大日期删除重复记录(Linq 查询)

来自分类Dev

SQL中的重复记录

来自分类Dev

在文本文件中查找重复记录

来自分类Dev

如何使用POI在Excel中检查重复记录?

来自分类Dev

使用 Distinct() 过滤 Linq 中的重复记录

来自分类Dev

删除基于多列的重复记录

来自分类Dev

如何从SQL Server删除重复记录?

来自分类Dev

动态SQL删除重复记录的过程

来自分类Dev

根据规则选择或删除重复记录

来自分类Dev

计算SQL中的重复记录,然后将重复记录的数量添加到记录数量中,并删除其余的记录