2016-03-21 27 views
0

基本的には、2つの異なるxslt変換の出力を結合する必要があります。2つのリストをxsltとマージする

私は2つの内のXSLTインポートと組み合わせるために「container.xslt」を使用しています:2つの変換ファイルがそのようにXSLTツーリングプログラムによって生成された「transform2.xslt」

を「transform1.xsltを」と私はそれらに変更を加えることを避けたいと思います。

これは私の入力xmlです:

<Enrollments> 
    <Enrollment> 
     <MEDICAL id="11111111"> 
     </MEDICAL> 
    </Enrollment> 
</Enrollments> 

これは私が現在取得しています出力されます。ここでは

<fields> 
    <fields> 
     <field name="ID1"> 
      <value>11111111</value> 
     </field> 
    </fields> 
    <fields> 
     <field name="ID2"> 
      <value>11111111</value> 
     </field> 
    </fields> 
</fields> 

は私が探して出力されます:

<fields> 
    <field name="ID1"> 
     <value>11111111</value> 
    </field> 
    <field name="ID2"> 
     <value>11111111</value> 
    </field> 
</fields> 

コンテナxslt

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs fn"> 

    <xsl:include href="./transform1.xslt"/> 
    <xsl:include href="./transform2.xslt"/> 

    <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/> 

    <xsl:variable name="list1"> 
     <xsl:call-template name="one" /> 
    </xsl:variable> 

    <xsl:param name="list2"> 
     <xsl:call-template name="two"/> 
    </xsl:param> 

    <xsl:template name="mergedList" match="/"> 
     <fields> 
      <xsl:copy-of select="$list1" /> 
      <xsl:copy-of select="$list2" /> 
     </fields> 
    </xsl:template> 

</xsl:stylesheet> 

transform1.xslt

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn"> 
     <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/> 
     <xsl:template match="/" name="one"> 
      <fields> 
       <field> 
        <xsl:attribute name="name" select="'ID1'"/> 
        <xsl:for-each select="Enrollments/Enrollment/MEDICAL"> 
         <value> 
          <xsl:sequence select="fn:string(@id)"/> 
         </value> 
        </xsl:for-each> 
       </field> 
      </fields> 
     </xsl:template> 
    </xsl:stylesheet> 

transform2.xslt

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn"> 
    <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/> 
    <xsl:template match="/" name="two"> 
     <fields> 
      <field> 
       <xsl:attribute name="name" select="'ID2'"/> 
       <xsl:for-each select="Enrollments/Enrollment/MEDICAL"> 
        <value> 
         <xsl:sequence select="fn:string(@id)"/> 
        </value> 
       </xsl:for-each> 
      </field> 
     </fields> 
    </xsl:template> 
</xsl:stylesheet> 

それは全く別の質問に属しているかもしれませんが、誰もが提案を持っている場合は、私がそれをここに追加します。私はcontainer.xsltに名前付きテンプレートを使用できるように、これらの2行を変換ファイルに追加する必要がありました。任意の提案を事前に

<xsl:attribute name="name" select="'ID1'"/> 

<xsl:attribute name="name" select="'ID2'"/> 

XLST輸入感謝を変えることを避けるために理想的です!私はかなり新しくxsltを手にしていません。

答えて

0

それは

<xsl:template name="mergedList" match="/"> 
    <fields> 
     <xsl:copy-of select="$list1/fields/field" /> 
     <xsl:copy-of select="$list2/fields/field" /> 
    </fields> 
</xsl:template> 

ような単純なものだろうか?


、これは十分にあるような単純な

<Enrollments> 
    <Enrollment> 
     <MEDICAL id="11111111"> 
     </MEDICAL> 
    </Enrollment> 
</Enrollments> 

<fields> 
    <field name="ID1"> 
     <value>11111111</value> 
    </field> 
    <field name="ID2"> 
     <value>11111111</value> 
    </field> 
</fields> 

に何かから行くの答え

の旧バージョン:

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

    <xsl:template match="Enrollments"> 
     <fields> 
      <xsl:apply-templates select="Enrollment"> 
       <xsl:with-param name="name" select="'ID1'" /> 
      </xsl:apply-templates> 
      <xsl:apply-templates select="Enrollment"> 
       <xsl:with-param name="name" select="'ID2'" /> 
      </xsl:apply-templates> 
     </fields> 
    </xsl:template> 

    <xsl:template match="Enrollment"> 
     <xsl:param name="name" /> 
     <field name="{$name}"> 
      <value><xsl:value-of select="MEDICAL/@id" /></value> 
     </field> 
    </xsl:template> 
</xsl:stylesheet> 

あなたが持っている他のものは、私に厳しく過度に設計されているようです。

+0

私はそれが過度に設計されているようだと同意します。私は2つのインポートされたxsltsをかなり単純化して、可能な限り一般的な例にしています。 2つのxslts変換を実行して出力を結合する方法が本当に必要です。提案していただきありがとうございますが、それは私の質問の根本的な問題になっていません。(たぶん私がそれに尋ねたから:-)) – WannaBeDev

+0

ああ。修正された解答を参照 – Tomalak

+0

素晴らしい、多くのありがとう!私はそれが何か単純だと思った。私は$ list1/fieldsではなく$ list1/fields/fieldを試していました – WannaBeDev

関連する問題