2016-03-21 24 views
0
ile birleştirilmesi

Temel olarak çıkışı iki farklı xslt dönüştürmesinden birleştirmem gerekiyor.İki listenin xslt

iki iç XSLTs ithalat ve birleştirmek için "container.xslt" kullanıyorum: Bir xslt takım program tarafından

iki dönüşümü dosyaları oluşturulur "transform1.xslt" ve "transform2.xslt" so Onlarda değişiklik yapmaktan kaçınmak istiyorum.

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

aradığım çıktısı:

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

Bu şu anda alıyorum çıktısı:

Bu

benim giriş xml olduğunu

container.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> 

Tamamen başka bir soru ait olabilir, ama ben durumda herkes buradan ekleyeceğiz bir önerisi var. Container.xslt dosyasında adlandırılmış şablonlar kullanmama izin vermek için bu iki satırı transform dosyalarıma eklemeliydim. Herhangi Önerileriniz için şimdiden ithal XLST

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

ve

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

sayesinde değişen önlemek için ideal olacaktır! Ben xslt için oldukça yeni ve çok el yazmadim.

cevap

0

burada olman kadar basit

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

olarak? cevap


Eski versiyon

bu kadar basit

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

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

bir şey gitmek için yeterlidir:

<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> 

Bulunduğunuz diğer şeyler bana aşırı derecede fazla işlenmiş gibi görünüyor.

+0

Çok fazla mühendislik göründüğünü kabul ediyorum. Mümkün olduğu kadar genel bir örnek yapmak için iki içe aktarılmış xslts'i basitleştirdim. İki xslts dönüşümünü çalıştırmanın ve çıktıları birleştirmenin bir yoluna ihtiyacım var. Öneri için teşekkürler, ama sorumun kök sorununa ulaşmıyor.(belki de nasıl istediğimden dolayı: -]) – WannaBeDev

+0

Ah. Değiştirilmiş cevaba bakınız. – Tomalak

+0

Fantastik, çok teşekkürler! Basit bir şey olduğunu düşündüm. $ List1/fields $ list1/fields/alan – WannaBeDev