2011-09-02 11 views
1

これが私の元のXMLファイルです:私はFirefoxのXULでXSLTプロセッサを使用して一つ一つを実行した場合に完全に取り組んでいる4つのXSLファイルを持っている複数のXSLファイル

<?xml version="1.0" encoding="windows-1250"?> 
<CONTACTS> 
    <CONTACT> 
     <FirstName>Arun</FirstName> 
     <LastName>Arun_niit</LastName> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>Arun</FirstName> 
     <LastName>Arun_niit</LastName> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>KumarVeera</FirstName> 
     <LastName>Veera Kumar</LastName> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>MarbellaFunkybuddha</FirstName> 
     <LastName>Funkybuddha Marbella</LastName> 
     <URL>http://www.facebook.com/profile.php?id=111123301493096451</URL> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>Rangarajkarthik</FirstName> 
     <LastName>karthik Rangaraj</LastName> 
     <EMail>[email protected]</EMail> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>Rangaraj</FirstName> 
     <LastName>karthik </LastName> 
     <EMail>[email protected]</EMail> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
</CONTACTS> 

。すべてのXSLファイルを1つずつ同時に実行すると、最終出力が生成されません。

これ以上のXMLファイルの実際の出力Iは、XSLファイルを使用する場合は、1つずつ:

function process() 
{ 
    var src = readFile("D:\\createXML2.xsl"); 
    var parsed = (new DOMParser()).parseFromString(src, "text/xml"); 
    var stylesheet = parsed.documentElement; 

    var processor = new XSLTProcessor(); 
    processor.importStylesheet(stylesheet); 

    objXMLDoc = processor.transformToDocument(objXMLDoc); 


    var serializer = new XMLSerializer(); 
    var prettyString = serializer.serializeToString(objXMLDoc); 

    saveFile(prettyString, "D:\\aout30.xml"); 
    //alert('New Contact updated successfully'); 


     var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 
          .getService(Components.interfaces.nsIPromptService); 

     prompts.alert(null, "Final creation", "Final creation is done"); 
process2(); 
} 

<?xml version="1.0" encoding="UTF-8"?> 
<CONTACTS> 
<CONTACT> 
<CUS-ID>PDE-ID2</CUS-ID> 
<FirstName>Arun</FirstName> 
<LastName>Arun_niit</LastName> 
<gmail>[email protected]</gmail> 
<yahoo>[email protected]</yahoo> 

<URL/> 
<Facebook-ID/> 
</CONTACT> 
<CONTACT> 
<CUS-ID>PDE-ID4</CUS-ID> 
<FirstName>KumarVeera</FirstName> 
<LastName>Veera Kumar</LastName> 
<gmail/> 
<yahoo>[email protected]</yahoo> 

<URL/> 
<Facebook-ID/> 
</CONTACT> 
<CONTACT> 
<CUS-ID>PDE-ID6</CUS-ID> 
<FirstName>MarbellaFunkybuddha</FirstName> 
<LastName>Funkybuddha Marbella</LastName> 
<gmail/> 
<yahoo/> 

<URL>http://www.facebook.com/profile.php?id=111123301493096451</URL> 
<Facebook-ID>1123301493096451</Facebook-ID> 
</CONTACT> 
<CONTACT> 
<CUS-ID>PDE-ID12</CUS-ID> 
<FirstName>Rangarajkarthik</FirstName> 
<LastName>karthik Rangaraj</LastName> 
<gmail>[email protected]</gmail> 
<yahoo>[email protected]</yahoo> 
<URL/> 
<Facebook-ID/> 
</CONTACT> 
</CONTACTS> 

これはXULでXSLファイルを呼び出すために、実際のJS関数であります同じFN & LN

との接触をマージするには:

はFile1:

これらは私が私の最終的な出力を生成するために使用しているXSLファイルがあります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

<xsl:key name="groupName" match="//CONTACTS/CONTACT" use="concat(FirstName, LastName)" /> 

<xsl:template match="CONTACTS"> 

    <CONTACTS> 
    <xsl:for-each select="//CONTACTS/CONTACT[generate-id() = generate-id(key('groupName', concat(FirstName, LastName)) [1]) ]" > 
    <xsl:sort select="CONTACT/EMail" /> 

     <xsl:call-template name="group"> 
     <xsl:with-param name="k1" select="FirstName" /> 
     <xsl:with-param name="k2" select="LastName" /> 
     </xsl:call-template> 

    </xsl:for-each> 
    </CONTACTS> 
</xsl:template> 

<xsl:template name="group"> 
<xsl:param name="k1" /> 
<xsl:param name="k2" /> 

    <CONTACT> 
    <xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][1]"> 

    <xsl:copy-of select="FirstName" />  
    <xsl:copy-of select="LastName" />  
    <!-- here we have the first Email --> 
    <xsl:copy-of select="EMail" />  

    </xsl:for-each> 
    <xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][position() &gt; 1]"> 
    <!-- here we have the next Email --> 

    <xsl:copy-of select="EMail" />  

    </xsl:for-each> 

    <xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][position() &gt; 2]"> 
    <!-- here we have the next Email --> 

    <xsl:copy-of select="EMail" />  

    </xsl:for-each> 

     <xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][position() &gt; 3]"> 
    <!-- here we have the next Email --> 

    <xsl:copy-of select="EMail" />  

    </xsl:for-each> 

    <xsl:copy-of select="URL" />  

    </CONTACT> 

</xsl:template> 
</xsl:stylesheet> 

ファイル2:ファイル4

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

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

    <xsl:template match="CONTACT"> 
     <xsl:copy> 

       <xsl:copy-of select="FirstName|LastName|URL"/> 
      <Facebook-ID><!-- To extract the ID value from URL/Email --> 
      <xsl:choose> 
       <xsl:when test="URL"> 
        <xsl:value-of select="substring-after(URL,'?id=')"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <!-- <xsl:value-of select="substring-before(EMail[1],'@')"/>--> 
       </xsl:otherwise> 
      </xsl:choose> 
     </Facebook-ID> 
      <EMAILS> 
       <xsl:apply-templates select="EMail"/> 
      </EMAILS> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="EMail"> 
     <EMail> <!-- To extract the Emails based on domain value from EMAIL --> 
      <Type><xsl:value-of select="substring-before(
        substring-after(.,'@'), 
        '.')"/> 
      </Type> 
      <Value><xsl:value-of select="."/></Value> 
     </EMail> 
    </xsl:template> 

</xsl:stylesheet> 

ドメインの種類に応じて電子メールの値を分離するためのファイル3:異なったコンタクト

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

    <xsl:key name="k_ContactsByEmail" 
     match="CONTACTS/CONTACT" 
     use="EMail"/> 

    <xsl:template match="CONTACTS"> 
     <xsl:copy> 
      <xsl:apply-templates select="CONTACT[generate-id()= 
       generate-id(key('k_ContactsByEmail',EMail)[1])] 
       | 
       CONTACT[not(EMail)]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="CONTACT"> 
     <xsl:copy> 
      <xsl:copy-of select="*"/> 
      <xsl:copy-of select=" 
       key('k_ContactsByEmail', EMail)/* 
        [not(.=current()/*)] 
        [not(self::FirstName or self::LastName)]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

ファイル3の同一のメールアドレスをマージするcutomer IDを生成します電子メールドメインタグを3番目のxsl生成出力ファイルから電子メール値タイプに追加します。

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


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

<xsl:template match="CONTACT"> 
<xsl:copy> 

<CUS-ID> 
    <xsl:apply-templates select="." mode="generate-id"/> 
    </CUS-ID> 


    <FirstName> 
     <xsl:value-of select="FirstName"/> 
    </FirstName> 

    <LastName> 
     <xsl:value-of select="LastName"/> 
    </LastName> 

    <gmail> 
      <xsl:value-of select="EMAILS/EMail[Type='gmail']/Value"/> 
    </gmail> 

    <yahoo> 
      <xsl:value-of select="EMAILS/EMail[Type='yahoo']/Value"/> 
    </yahoo> 


    <URL> 
      <xsl:value-of select="URL"/> 
    </URL> 

    <Facebook-ID> 
      <xsl:value-of select="Facebook-ID"/> 
    </Facebook-ID> 

     </xsl:copy> 
</xsl:template> 

<xsl:template match="node()" mode="generate-id"> 
      <xsl:text>PDE-ID</xsl:text> 
      <xsl:number level="any" count="node()" format="10000"/> 
</xsl:template> 

</xsl:stylesheet> 

時には、適切な出力を生成していますが、ほとんどの場合は動作しません。 私は本当に何が問題か理解できません。これらのSLファイルをすべて1つのファイルとして結合する可能性はありますか?私を助けてください。ありがとうございました。

+0

何それは "動作しない" だとき、正確になりますか?あなたのJSコードから、私は3つの中間結果と最終結果があることを理解しています。私は、あなたがalert()呼び出しを取り除くことを同時に意味すると思います。エラーコンソールにメッセージが表示されたり、中間結果に問題があると思われますか? readFile()とsaveFile()はどのように見えますか?中間結果でファイルから読み込んだ文字列をログに記録するとどうなりますか? – Nickolay

+0

@Nickolay:一般に、readFile()とsaveFile()は、XSLファイルを読み込むためのjavascript関数であり、XMLファイルをFirefoxが推奨するprettyStringとして保存します。いつか起こることは、XSLファイルのいずれかが適切な出力を出さなかったので、次のXSLファイルは正確には動作しません。 Firefoxのエラーコンソールにはエラーはありません。これらのXSLファイルをすべて1つのファイルとして結合する方法はありますか? – linguini

答えて

1

上記のトランスフォームを組み合わせるには、node-set()拡張機能が必要です(これはおそらくあなたのjavascriptライブラリからは利用できません)。

しかし、上記の入力サンプル(他のケースをカバーするために多少変更されています)では、1つの変換ですべてのタスクを実行することは可能です。 URLノードが重複CONTACTにあるとき

(あまりにもその1)あなたのソリューションを注意はFacebookの-ID生成された要素を処理しません。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="k_Name" match="CONTACTS/CONTACT" 
     use="concat(FirstName, LastName)" /> 
    <xsl:key name="k_Email" match="CONTACTS/CONTACT" 
     use="EMail" /> 

    <xsl:template match="CONTACTS"> 
     <xsl:copy> 
      <xsl:apply-templates select=" 
       CONTACT[generate-id() 
       = generate-id(key('k_Email',EMail)[1]) 
       and generate-id() 
       = generate-id(key('k_Name',concat(FirstName,LastName))[1])] 
       | 
       CONTACT[not(EMail)]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="CONTACT"> 
     <xsl:copy> 

      <CUS-ID> 
       <xsl:apply-templates select="." mode="generate-id"/> 
      </CUS-ID> 

      <xsl:copy-of select="FirstName|LastName"/> 

      <Facebook-ID><!-- To extract the ID value from URL/Email --> 
       <xsl:choose> 
        <xsl:when test="URL"> 
         <xsl:value-of select="substring-after(URL,'?id=')"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <!-- <xsl:value-of select="substring-before(EMail[1],'@')"/>--> 
        </xsl:otherwise> 
       </xsl:choose> 
      </Facebook-ID> 

      <xsl:apply-templates select=" 
       (* 
       | 
       key('k_Email', EMail)/* 
       [not(.=current()/*)] 
       | 
       key('k_Name',concat(FirstName,LastName))/* 
       [not(.=current()/*)]) 
       [not(self::FirstName or self::LastName)]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="URL"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 

    <xsl:template match="EMail"> 
     <xsl:element name="{substring-before(
      substring-after(.,'@'), 
      '.')}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 


    <xsl:template match="node()" mode="generate-id"> 
     <xsl:text>PDE-ID</xsl:text> 
     <xsl:number level="any" count="node()" format="10000"/> 
    </xsl:template> 

</xsl:stylesheet> 

次の入力に適用される:

<CONTACTS> 
    <CONTACT> 
     <FirstName>Arun</FirstName> 
     <LastName>Arun_niit</LastName> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>Arun</FirstName> 
       <LastName>Arun_niit</LastName> 
       <URL>aaa</URL> 
     <EMail>[email protected]</EMail> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>KumarVeera</FirstName> 
     <LastName>Veera Kumar</LastName> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>MarbellaFunkybuddha</FirstName> 
     <LastName>Funkybuddha Marbella</LastName> 
     <URL>http://www.facebook.com/profile.php?id=111123301493096451</URL> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>Rangarajkarthik</FirstName> 
     <LastName>karthik Rangaraj</LastName> 
     <EMail>[email protected]</EMail> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
    <CONTACT> 
     <FirstName>Rangaraj</FirstName> 
     <LastName>karthik </LastName> 
     <EMail>[email protected]</EMail> 
     <EMail>[email protected]</EMail> 
    </CONTACT> 
</CONTACTS> 

が生成する:

<CONTACTS> 
    <CONTACT> 
     <CUS-ID>PDE-ID00002</CUS-ID> 
     <FirstName>Arun</FirstName> 
     <LastName>Arun_niit</LastName> 
     <Facebook-ID/> 
     <yahoo>[email protected]</yahoo> 
     <URL>aaa</URL> 
     <gmail>[email protected]</gmail> 
     <gmai>[email protected]</gmai> 
    </CONTACT> 
    <CONTACT> 
     <CUS-ID>PDE-ID00020</CUS-ID> 
     <FirstName>KumarVeera</FirstName> 
     <LastName>Veera Kumar</LastName> 
     <Facebook-ID/> 
     <yahoo>[email protected]</yahoo> 
    </CONTACT> 
    <CONTACT> 
     <CUS-ID>PDE-ID00027</CUS-ID> 
     <FirstName>MarbellaFunkybuddha</FirstName> 
     <LastName>Funkybuddha Marbella</LastName> 
     <Facebook-ID>111123301493096451</Facebook-ID> 
     <URL>http://www.facebook.com/profile.php?id=111123301493096451</URL> 
    </CONTACT> 
    <CONTACT> 
     <CUS-ID>PDE-ID00034</CUS-ID> 
     <FirstName>Rangarajkarthik</FirstName> 
     <LastName>karthik Rangaraj</LastName> 
     <Facebook-ID/> 
     <gmail>[email protected]</gmail> 
     <yahoo>[email protected]</yahoo> 
    </CONTACT> 
</CONTACTS> 
+0

:このプロセスではデータを評価していません。私のjava-script関数は、XMLとXSLファイルを読み込んで、XSLで生成されたXMLファイルをXULTプロセッサでXULに保存することです。 EclipseであなたのXSLファイルを実行しました。うまくいきます。私がXUL XSLTプロセッサーをチェックインしたとき、それは適切な出力を生成しませんでした。最後に、私はMozilla Firefoxでバグを起こしました。どうもありがとうございました。 – linguini

関連する問題