XSLT

2016-04-14 37 views
0

'daki farklı bir belgeden nasıl değerler alabilirim? İki XML dosyasını XSLT Sürüm 1.0 ile birleştirmem gerekiyor. Benim Sorunum, 2. XML dosyasının Niteliklerini ilk dosyanın Özniteliklerine eklemem gerektiğidir. Sorunumu açıklığa kavuşturmak için size bir örnek vereyim.XSLT

xml1:

<sample> 
    <tag a="1" b="2" c="3" d="4" /> 
    <tag a="2" b="3" c="4" d="5" /> 
</sample> 

XML2:

<sample> 
    <tag e="5" f="6" g="7" /> 
    <tag e="10" f="12" g="11" /> 
</sample> 

Çıktı:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ws="http://www.w3schools.com"> 
<xsl:template match="/">     
<xsl:for-each select="sample/tag"> 
<tag> 
    <xsl:attribute name="a"><xsl:value-of select="@a"/></xsl:attribute> 
    <xsl:attribute name="b"><xsl:value-of select="@b"/></xsl:attribute> 
    <xsl:attribute name="c"><xsl:value-of select="@c"/></xsl:attribute> 
    <xsl:attribute name="d"><xsl:value-of select="@d"/></xsl:attribute> 
    <xsl:attribute name="e"><xsl:value-of select="document('xml2.xml')//@e"/></xsl:attribute> 
    <xsl:attribute name="f"><xsl:value-of select="document('xml2.xml')//@f"/></xsl:attribute> 
    <xsl:attribute name="g"><xsl:value-of select="document('xml2.xml')//@g"/></xsl:attribute> 
<tag> 
</xsl:for-each> 

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

<sample> 
<tag a="1" b="2" c="3" d="4" e="5" f="6" g="7" /> 
<tag a="2" b="3" c="4" d="5" e="10" f="12" g="11" /> 
</sample> 

Bunun için XSLT'de aşağıdaki çalıştı

Ancak, 2. XML Dosyasının yalnızca ilk satırını aldım. Benim çıkışım:

<sample> 
<tag a="1" b="2" c="3" d="4" e="5" f="6" g="7" /> 
<tag a="2" b="3" c="4" d="5" e="5" f="6" g="7" /> 
</sample> 

Umarım bu konuda bana yardımcı olabilirsiniz. Ben XSLT için tamamen yeni. tag elemana ekstra özellikler eklemek için,

cevap

1

deneyin bire bir konum eşleştirmesi:

<xsl:template match="/sample"> 
    <sample> 
    <xsl:apply-templates select="tag" /> 
    </sample> 
</xsl:template> 

<xsl:template match="tag"> 
    <xsl:variable name="pos" select="position()" /> 
    <tag> 
    <xsl:copy-of select="@*" /> 
    <xsl:copy-of select="document('a2.xml')/sample/tag[$pos]/@*" /> 
    </tag> 
</xsl:template> 

Çıktı geçerli: Cevabınız için

<?xml version="1.0"?> 
<sample> 
    <tag a="1" b="2" c="3" d="4" e="5" f="6" g="7"/> 
    <tag a="2" b="3" c="4" d="5" e="10" f="12" g="11"/> 
</sample> 
0

Öncelikle, mevcut düğümlerin kopyalamak için XSLT identity template ile kapalı başlayarak şeyleri basitleştirmek ve

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

Sonra ilk XML'deki özellik, bir var Bu ise tag

<xsl:template match="tag"> 

eşleşen şablon, daha sonra şimdiki öğenin konumunu almak gerekir, bu nedenle ikinci aynı pozisyonda alakalı tag eleman bulabilirsiniz Sonra

<xsl:variable name="position"> 
    <xsl:number /> 
</xsl:variable> 

belge, bunu gibi ikinci belgeden özelliklerini seçebilirsiniz:

<xsl:apply-templates select="document('xml2.xml')/sample/tag[position() = $position]/@*"/> 

Kısa ve kolay bir şekilde uygulayarak aşağıdaki şablonu kullanarak bu XSLT

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

    <xsl:template match="tag"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:variable name="position"> 
       <xsl:number /> 
      </xsl:variable> 
      <xsl:apply-templates select="document('xml2.xml')/sample/tag[position() = $position]/@*"/> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 

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

teşekkürler. 'ı önlemek için herhangi bir şans var mı? Gerçekten büyük XML dosyaları için kullanıyorum ve yavaş yavaş çok fazla. Ama XSLT oldukça iyi çalışıyor. – tingelcore

+0

Nasıl zx485'in cevabına bakınız. Açık bir ' 'olduğunu unutmayın. Bu gereklidir çünkü aksi takdirde 'position(), beyaz boşluk düğümlerinden veya' sample 'altındaki diğer elemanlardan etkilenir. –