2016-05-20 2 views
0

Ähnliche Fragen wurden gestellt, und ich habe sie gelesen und versucht, dies herauszufinden mit Tutorials und was nicht, aber nicht in der Lage. Ich bin mir sicher, dass es darum geht, den richtigen XPath zu schreiben, aber ich kann es nicht herausfinden. Ich versuche, eine Liste von Dateien (im Grunde alles in einem Ordner) zu nehmen und sie in ein anderes Schema-Format zu kombinieren. Der Trick besteht darin, dass ein Teil der Informationen aus den einzelnen Dateien als Nachschlagetabelle in der resultierenden XML-Datei verwendet werden muss. Meine Lösung muss rein XSLT1.0 sein. Es geht wahrscheinlich ohne zu sagen, dass alles unter fiktiv ... außer vielleicht die Struktur der „manifestiert“ xml-Datei, die wie folgt aussieht:Zusammenführen von Daten aus mehreren XML-Dateien ohne Duplikate mit XSLT

<files> 
    <file>request1.xml</xml> 
    <file>request2.xml</xml> 
    <file>request3.xml</xml> 
<files> 

Request1.xml Datei wie folgt aussehen könnte:

<?xml version="1.0" encoding="UTF-8"?> 
<ProductList xmlns:pl="http://products.produsor.com/pml" xmlns:pi="http://standards.product.produsor.com/pml" createDateTime="2014-05-06T18:13:51.0Z" version="5.0"> 
    <pl:Request requestId="ADF87A9DF7" quantity="1"> 
     <pl:SystemIdentifier name="GUID">38DDF5C1-A049-44DB-9EEA-3F5CB831228D</pl:SystemIdentifier> 
     <pl:SystemIdentifier name="UPC">4236483268</pl:SystemIdentifier> 
     <pl:Product> 
      <pl:Names> 
       <pi.ProductNameLongDescription>Classic Design Round Dinning Table</pi.ProductNameLongDescription> 
       <pi.ProductNameShort>Dinning Table</pi.ProductNameShort> 
      </pl:Names> 
      <pl:Description> 
       <pi.ProductLongDescription>This is a really awesome table.</pi.ProductLongDescription> 
       <pi.ProductShortDescription>It's made of wood</pi.ProductShortDescription> 
      </pl:Description> 
      <pl:Category> 
       <pl:Name>Table</pl:Name> 
       <pl:Description>This category is for tables</pl:Description> 
       <pl:Priority>1</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Dinning Furniture</pl:Name> 
       <pl:Description>This category is for Dinning Furniture</pl:Description> 
       <pl:Priority>2</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Wood Furniture</pl:Name> 
       <pl:Description>This category is for Wood Furniture</pl:Description> 
       <pl:Priority>3</pl:Priority> 
      </pl:Category> 
     </pl:Product> 
    </pl:Request> 
    <pl:Request requestId="DA7FDAFDA9" quanitity="1"> 
     <pl:SystemIdentifier name="GUID">DA7FDAFD-B049-45DB-9FFA-3F5CB834328D</pl:SystemIdentifier> 
     <pl:SystemIdentifier name="UPC">4236483269</pl:SystemIdentifier> 
     <pl:Product> 
      <pl:Names> 
       <pi.ProductNameLongDescription>Classic Design Round Coffee Table</pi.ProductNameLongDescription> 
       <pi.ProductNameShort>Coffee Table</pi.ProductNameShort> 
      </pl:Names> 
      <pl:Description> 
       <pi.ProductLongDescription>This is a really awesome table.</pi.ProductLongDescription> 
       <pi.ProductShortDescription>It is made of wood</pi.ProductShortDescription> 
      </pl:Description> 
      <pl:Category> 
       <pl:Name>Table</pl:Name> 
       <pl:Description>This category is for tables</pl:Description> 
       <pl:Priority>1</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Living Room Furniture</pl:Name> 
       <pl:Description>This category is for Dinning Furniture</pl:Description> 
       <pl:Priority>4</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Wood Furniture</pl:Name> 
       <pl:Description>This category is for Wood Furniture</pl:Description> 
       <pl:Priority>3</pl:Priority> 
      </pl:Category> 
     </pl:Product> 
    </pl:Request> 
</ProductList> 

Und Request2.xml würde wie folgt sein:

<?xml version="1.0" encoding="UTF-8"?> 
<ProductList xmlns:pl="http://products.produsor.com/pml" xmlns:pi="http://standards.product.produsor.com/pml" createDateTime="2014-05-06T18:13:51.0Z" version="5.0"> 
    <pl:Request requestId="DFADF08D0A" quantity="10"> 
     <pl:SystemIdentifier name="GUID">38DDF5C1-A049-44DB-9EEA-3F5CB831228D</pl:SystemIdentifier> 
     <pl:SystemIdentifier name="UPC">4236483268</pl:SystemIdentifier> 
     <pl:Product> 
      <pl:Names> 
       <pi.ProductNameLongDescription>Classic Design Round Dinning Table</pi.ProductNameLongDescription> 
       <pi.ProductNameShort>Dinning Table</pi.ProductNameShort> 
      </pl:Names> 
      <pl:Description> 
       <pi.ProductLongDescription>This is a really awesome table.</pi.ProductLongDescription> 
       <pi.ProductShortDescription>It's made of wood</pi.ProductShortDescription> 
      </pl:Description> 
      <pl:Category> 
       <pl:Name>Table</pl:Name> 
       <pl:Description>This category is for tables</pl:Description> 
       <pl:Priority>1</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Dinning Furniture</pl:Name> 
       <pl:Description>This category is for Dinning Furniture</pl:Description> 
       <pl:Priority>2</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Wood Furniture</pl:Name> 
       <pl:Description>This category is for Wood Furniture</pl:Description> 
       <pl:Priority>3</pl:Priority> 
      </pl:Category> 
     </pl:Product> 
    </pl:Request> 
    <pl:Request requestId="RER7689EQ9" quanitity="10"> 
     <pl:SystemIdentifier name="GUID">DA7FDAFD-B049-45DB-9FFA-3F5CB834328D</pl:SystemIdentifier> 
     <pl:SystemIdentifier name="UPC">4236483269</pl:SystemIdentifier> 
     <pl:Product> 
      <pl:Names> 
       <pi.ProductNameLongDescription>Classic Design Round Coffee Table</pi.ProductNameLongDescription> 
       <pi.ProductNameShort>Coffee Table</pi.ProductNameShort> 
      </pl:Names> 
      <pl:Description> 
       <pi.ProductLongDescription>This is a really awesome table.</pi.ProductLongDescription> 
       <pi.ProductShortDescription>It is made of wood</pi.ProductShortDescription> 
      </pl:Description> 
      <pl:Category> 
       <pl:Name>Table</pl:Name> 
       <pl:Description>This category is for tables</pl:Description> 
       <pl:Priority>1</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Living Room Furniture</pl:Name> 
       <pl:Description>This category is for Dinning Furniture</pl:Description> 
       <pl:Priority>4</pl:Priority> 
      </pl:Category> 
      <pl:Category> 
       <pl:Name>Wood Furniture</pl:Name> 
       <pl:Description>This category is for Wood Furniture</pl:Description> 
       <pl:Priority>3</pl:Priority> 
      </pl:Category> 
     </pl:Product> 
    </pl:Request> 
</ProductList> 

Und was ich will, ist folgende:

<ProductList xmlns:pl="http://products.produsor.com/pml"> 
    <pl:Submission> 
<!--********* This is the problem area *************--> 
     <pl:Descriptions> 
      <pl:Description id="1">This is a really awesome table.</pl:Description> 
     </pl:Descriptions> 
     <pl:Categories> 
      <pl:Category id="1">Table</pl:Category> 
      <pl:Category id="2">Dinning Furniture</pl:Category> 
      <pl:Category id="3">Living Room Furniture</pl:Category> 
      <pl:Category id="4">Wood Furniture</pl:Category> 
     </pl:Categories> 
<!--****************************************************--> 
     <pl:Product> 
      <pl:SystemIdentifier type="GUID">DA7FDAFD-B049-45DB-9FFA-3F5CB834328D</pl:SystemIdentifier> 
      <pl:SystemIdentifier name="UPC">4236483268</pl:SystemIdentifier> 
      <pl:ProductName descriptionId="1">Dinning Table</pl:ProductName> 
      <cat catId="1"/> 
      <cat catId="2"/> 
      <cat catId="3"/> 
     </pl:Product> 
     <pl:Product> 
      <pl:SystemIdentifier type="GUID">DA7FDAFD-B049-45DB-9FFA-3F5CB834328D</pl:SystemIdentifier> 
      <pl:SystemIdentifier name="UPC">4236483268</pl:SystemIdentifier> 
      <pl:ProductName descriptionId="1">Dinning Table</pl:ProductName> 
      <cat catId="1"/> 
      <cat catId="3"/> 
      <cat catId="4"/> 
     </pl:Product>  
     <pl:Product> 
      <pl:SystemIdentifier type="GUID">DA7FDAFD-B049-45DB-9FFA-3F5CB834328D</pl:SystemIdentifier> 
      <pl:SystemIdentifier name="UPC">4236483268</pl:SystemIdentifier> 
      <pl:ProductName descriptionId="1">Dinning Table</pl:ProductName> 
      <cat catId="1"/> 
      <cat catId="2"/> 
      <cat catId="3"/> 
     </pl:Product> 
     <pl:Product> 
      <pl:SystemIdentifier type="GUID">DA7FDAFD-B049-45DB-9FFA-3F5CB834328D</pl:SystemIdentifier> 
      <pl:SystemIdentifier name="UPC">4236483268</pl:SystemIdentifier> 
      <pl:ProductName descriptionId="1">Dinning Table</pl:ProductName> 
      <cat catId="1"/> 
      <cat catId="3"/> 
      <cat catId="4"/> 
     </pl:Product> 
    </pl:Submission> 
</ProductList> 

Der Trick ist, dass ich keine wiederholenden Werte in den pl:Description oder pl:category Tags haben kann. Es ist erforderlich, dass sich die Produktelemente wiederholen, wenn sie in den Dateien wiederholt werden. Ich habe die xslt-Vorlagen erstellt, um alles zu konstruieren, einschließlich der Beschreibungen und Kategorien, aber es tut es für jede Datei. Ich brauche es einmal die Beschreibungen und Kategorien zu erstellen, einschließlich der eindeutigen Daten aus allen Dateien und dann alle Produktelemente. Hier ist was ich bisher habe, welches die Produktelemente baut.

<xsl:template match="/"> 
    <xsl:for-each select="/files/file"> 
     <xsl:apply-templates select="document(.)/ProductList/pl:Request"/> 
    </xsl:for-each> 
</xsl:template> 

Da dies ziemlich lange schon ist, werde ich nur sagen, dass die Anfrage Vorlage, um die Produktelemente erstellen funktioniert und ich habe eine „Produktliste“ Vorlage, die die Beschreibungen und Kategorien Elementstruktur schaffen. Hier

+0

Wenn Sie mehrere Dateien zusammenführen müssen, zeigen Sie uns zwei minimale Beispiele und das zusammengeführte Ergebnis und erläutern Sie, welche Kriterien Sie zusammenführen möchten. –

+0

Ich habe bearbeitet, um ein anderes Beispiel der Datei einzuschließen (sie sind fast identisch), das ist repräsentativ dafür, wie die Daten in den tatsächlichen XML-Dateien sind. Ich fasse alle Dateien und Daten zusammen. Es gibt keine Kriterien zum Filtern von "Produkten". –

+0

Können Sie 'exsl: node-set' oder ähnliches verwenden? Oder ist das jenseits von "reinem" XSLT 1.0? –

Antwort

1

ist ein Beispiel, dass die Kopien alle Kategorien in einem Ergebnisbaum-Fragment, verwendet exsl:node-set und dann Muench-Gruppierung eindeutige Kategorien zu identifizieren und dann auf sie verweist, wenn die Anforderungselemente kopieren:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    xmlns:pl="http://products.produsor.com/pml" 
    version="1.0" 
    exclude-result-prefixes="exsl"> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="input-docs" select="document(files/file)"/> 

    <xsl:variable name="cats-rtf"> 
     <xsl:copy-of select="$input-docs//pl:Category"/> 
    </xsl:variable> 

    <xsl:key name="group" match="pl:Category" use="pl:Name"/> 

    <xsl:variable name="distinct-cats-rtf"> 
     <xsl:for-each select="exsl:node-set($cats-rtf)/pl:Category[generate-id() = generate-id(key('group', pl:Name)[1])]"> 
      <pl:Category id="{position()}"> 
       <xsl:value-of select="pl:Name"/> 
      </pl:Category> 
     </xsl:for-each> 
    </xsl:variable> 

    <xsl:variable name="distinct-cats" select="exsl:node-set($distinct-cats-rtf)/pl:Category"/> 

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

    <xsl:template match="/"> 
     <ProductList> 
      <pl:Submission> 
       <pl:Categories> 
        <xsl:copy-of select="$distinct-cats"/> 
       </pl:Categories> 
       <xsl:apply-templates select="$input-docs//pl:Request"/> 
      </pl:Submission> 
     </ProductList> 
    </xsl:template> 

    <xsl:template match="pl:Category"> 
     <cat catId="{$distinct-cats[. = current()/pl:Name]/@id}"/> 
    </xsl:template> 

</xsl:stylesheet> 

Sie könnten das gleiche verwenden Ansatz, um die eindeutigen Beschreibungen zu identifizieren und sie zu referenzieren.

+0

Danke. Das sieht ziemlich einfach aus. Ich werde so schnell wie möglich eine Aufnahme machen (nicht genug Glück, um bei diesem Projekt von zu Hause aus arbeiten zu können). –

+0

Leider kann ich exsl nicht verwenden. Ich habe versucht und ich bekomme "Namespace 'http://exslt.org/common' enthält keine Funktionen." Ich vermute, dass es etwas mit unserer Netzwerksicherheit zu tun hat. –

+0

Nun, finden Sie heraus, welchen XSLT-Prozessor Sie verwenden, zum Beispiel indem Sie http://home.arcor.de/martin.honnen/xslt/processorTest2 ausführen.xml durch Ihren Prozessor, dann überprüfen Sie die Dokumentation für eine Erweiterungsfunktion, um ein Ergebnisbaumfragment in eine Knotenmenge zu konvertieren. –

Verwandte Themen