2009-03-14 10 views
6

मैं इसXSLT: मर्ज डुप्लिकेट परिदृश्य

<ContractInfo ContractNo="12345"> 
       <Details LastName="Goodchild">       
         <Filedata FileName="File1"/> 
       </Details> 
</ContractInfo> 

<ContractInfo ContractNo="12345"> 
       <Details LastName="Goodchild">       
         <Filedata FileName="File2"/> 
       </Details> 
</ContractInfo> 

<ContractInfo ContractNo="123456"> 
       <Details LastName="Goodchild">       
         <Filedata FileName="File2"/> 
       </Details> 
</ContractInfo> 

मैं अपने उत्पादन एक्सएमएल इस

<ContractInfo ContractNo="12345"> 
       <Details LastName="Goodchild">       
         <Filedata FileName="File1"/> 
         <Filedata FileName="File2"/> 
       </Details> 
</ContractInfo> 

<ContractInfo ContractNo="123456"> 
       <Details LastName="Goodchild">       
         <Filedata FileName="File2"/> 
       </Details> 
</ContractInfo> 

यहाँ, 'FileData' से मेल खाते से संबंधित "contractNo" की जरूरत है की तरह बनना चाहता हूँ की तरह एक एक्सएमएल आउटपुट में संयुक्त होने के लिए। क्या एक्सएसएलटी के साथ यह परिवर्तन हासिल किया जा सकता है?

अग्रिम धन्यवाद।

श्रीनिवास

+0

XSLT और मंच के संस्करण उपयोगी – AnthonyWJones

उत्तर

7

निम्नलिखित XSLT 1.0 परिवर्तन सही परिणाम पैदा करता है:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="contract" match="ContractInfo" use="@ContractNo" /> 
    <xsl:key name="filedata" match="Filedata" use="../../@ContractNo" /> 

    <xsl:template match="ContractInfo"> 
    <xsl:if test="generate-id() = 
        generate-id(key('contract', @ContractNo)[1])"> 
     <xsl:copy> 
     <xsl:apply-templates select="key('contract', @ContractNo)/Details | @*" /> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="Details"> 
    <xsl:if test="generate-id(..) = 
        generate-id(key('contract', ../@ContractNo)[1])"> 
     <xsl:copy> 
     <xsl:apply-templates select="key('filedata', ../@ContractNo) | @*" /> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

    <!-- copy everything else (root node, Filedata nodes and @attributes) --> 
    <xsl:template match="* | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="* | @*" /> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

नोट एक मिलान नोड सेट के पहले नोड की पहचान करने के generate-id() साथ संयोजन के रूप में <xsl:key> का उपयोग करते हैं, प्रभावी रूप से बराबर नोड्स समूहीकरण साथ में।

<xsl:apply-templates> के भीतर <xsl:sort> का उपयोग करके आप आदेशित परिणाम को मजबूर कर सकते हैं। मैंने स्पष्टता के लिए इसे शामिल नहीं किया था।

मेरा परीक्षण उत्पादन है:

<root> 
    <ContractInfo ContractNo="12345"> 
    <Details LastName="Goodchild"> 
     <Filedata FileName="File1"></Filedata> 
     <Filedata FileName="File2"></Filedata> 
    </Details> 
    </ContractInfo> 
    <ContractInfo ContractNo="123456"> 
    <Details LastName="Goodchild"> 
     <Filedata FileName="File2"></Filedata> 
    </Details> 
    </ContractInfo> 
</root> 
+0

हो सकता है यह परिवर्तन के साथ-साथ दो प्रतियों नोड्स बाहर करने के लिए विस्तार करने के लिए अपेक्षाकृत आसान है। चूंकि वह मूल आवश्यकता का हिस्सा नहीं था, इसलिए मैंने इसे पाठक के लिए एक अभ्यास के रूप में छोड़ दिया। ;-) संकेत: एक अतिरिक्त और दूसरा आवश्यक है। – Tomalak

+0

हाय, शानदार सामान .. क्या इन अवधारणाओं का अध्ययन करने के लिए कोई अतिरिक्त लिंक है? क्या आप सुझाव दे सकते हैं कि मूलभूत रूप से इन परिवर्तनों को शामिल किया जाए? –

+0

इंटरनेट पर एक्सएसएलटी/एक्सपीएथ संबंधित वेब साइटों और ट्यूटोरियल के भार हैं। बस उन हिस्सों को Google पर समझें जिन्हें आप समझ में नहीं आते हैं। एक्सएसएलटी ज्ञान के आपके वर्तमान स्तर के आधार पर, समाधान में पारदर्शी बनने में कुछ समय लग सकता है। ;-) – Tomalak