2011-09-05 17 views
7

Sorun, birden çok XML dosyasını XSL ile birleştirip sıralamak ve geçerli HTML çıktılamak, Firefox> = 3.5 ile görüntülenebilir ve eğer mümkünse IE> = 7. Cevap mümkün olduğunca basit olmalıdır (performans önemli değildir).XSL ile çoklu XML Dosyalarını birleştir ve sırala

Dosya a.xml

<?xml version="1.0"?> 
<root> 
    <tag>cc</tag> 
    <tag>aa</tag> 
</root> 

Dosya b.xml

<?xml version="1.0"?> 
<root> 
    <tag>xx</tag> 
    <tag>bb</tag> 
</root> 

Dosya index.xml

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="merge.xslt"?> 
<list> 
    <entry>a.xml</entry> 
    <entry>b.xml</entry> 
</list> 

Dosya merge.xslt

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ph="http://ananas.org/2003/tips/photo"> 

    <xsl:output method="html"/> 

    <xsl:template match="list"> 
     <html> 
      <body> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="entry"> 
     <xsl:for-each select="document(.)/root/tag"> 
      <!-- This will only sort the values of a single file --> 
      <xsl:sort select="." data-type="text" order="ascending" /> 
      - <xsl:value-of select="."/> <br/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Akım çıkışı:

  • aa

  • cc

  • bb

  • xx

Beklenen çıkışı:

  • aa

  • bb

  • cc

  • xx

+1

İyi soru, +1. Diğer cevaplardan herhangi birinin karmaşıklığına sahip olmayan tam, çok kısa ve kolay bir çözüm için cevabımı görün: hiçbir uzatma fonksiyonu yok, değişken yok, no xsl: for-each ... –

+0

Ayrıca kapsamlı bir açıklama ekledi. –

cevap

8

bu çözüm, çok kolay ve kısa bir dönüşüm (kesinlikle bir uzantısıdır fonksiyonları Yeniden gerekli):!

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

<xsl:template match="/*"> 
    <html> 
    <ul> 
    <xsl:apply-templates 
     select="document(entry)/*/tag"> 
     <xsl:sort/> 
    </xsl:apply-templates> 
    </ul> 
    </html> 
</xsl:template> 

<xsl:template match="tag"> 
    <li><xsl:value-of select="."/></li> 
</xsl:template> 
</xsl:stylesheet> 

bu dönüşümün sağlanan endeksi uygulandığında.xml dosya:

<html> 
    <ul> 
     <li>aa</li> 
     <li>bb</li> 
     <li>cc</li> 
     <li>xx</li> 
    </ul> 
</html> 

ve olarak herhangi bir tarayıcıda görüntülenir:

<list> 
    <entry>a.xml</entry> 
    <entry>b.xml</entry> 
</list> 

aranan, doğru sonuç üretilir

  • aa
  • bb
  • cc
  • xx

açıklama: Bu çözelti, standart XSLT işlevinin document() gücünü kullanır. W3C XSLT 1.0 tavsiyesi de tanımlandığı gibi:

belge işlevi tek bir bağımsız değişken ve bağımsız değişken sahip sonra sonuç birliği değişken her düğüm için, bir düğüm dizi nod

:

Bu bizim kod bu parçanın etkisi açıklar düğümünün dizgesel değerini ilk argüman document işlevinin sonucu, set

<xsl:apply-templates 
    select="document(entry)/*/tag"> 
    <xsl:sort/> 
</xsl:apply-templates> 

Burada meydana gelen, document() işlevinin argümanı, index.xml öğesinin üst öğesinin tüm entry çocuklarının düğüm kümesidir. Sonuç, tüm belge düğümlerinin birleşimidir. Bu nedenle

:

select="document(entry)/*/tag" 

index.xml başvurulan tüm belgeler tüm tag unsurları seçer

. Daha sonra sıralanırlar (xsl:sort) ve zaten sıralanmış nodelist öğesinin her bir öğesi tag ile eşleşen şablon tarafından işlenir.

+0

Kabul edildi, çünkü cevap işe yarıyor ve anlaşılması kolaydır. Çok iyi bir açıklama! – gaddomn

+1

Neden bu kadar karmaşık olduğumu bilmiyorum. Dinlenmeye ihtiyacım var. En iyi ve kolay yaklaşım için +1. –

+0

@gaddomn: Rica ederim. @_empo: Siz de. –