2016-08-09 199 views
0

ich viele XML-Dateien wie folgen aus:XSLT concat viele Dateien

file1.xml:

<Document xmlns="Forward"> 
    <Id>123456789</Id> 
</Document> 

File2.xml:

<Document xmlns="Forward"> 
    <Id>4568844</Id> 
</Document> 

Ich mag diese Dateien verketten und fügen Präfix zum Namespace wie folgt:

Ausgabe:

<?xml version="1.0" encoding="UTF-8"?> 
<mes:Fichier xmlns:mes="message"> 
    <mes:Rcvr>RECEIVE</mes:Rcvr> 
    <doc:Document xmlns:doc="Forward"> 
    <doc:Id>123456789</doc:Id> 
    </doc:Document> 
    <doc:Document xmlns:doc="Forward"> 
    <doc:Id>4568844</doc:Id> 
    </doc:Document> 
</mes:Fichier> 

Meine XLS:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:mes="message" > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="Rcvr"/> 
    <xsl:param name="fileList"/> 

    <xsl:template match="/"> 
     <xsl:copy> 
      <mes:Fichier xmlns:mes="message" > 
       <mes:Rcvr><xsl:value-of select="$Rcvr"/></mes:Rcvr> 
       <xsl:apply-templates select="@*|node()" /> 
      </mes:Fichier> 
     </xsl:copy> 
    </xsl:template> 


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

</xsl:stylesheet> 
+1

Was genau wird der Inhalt von '$ fileList' sein? Verwenden Sie einen XSLT 2.0-Prozessor? –

+0

$ fileList wird jetzt nicht verwendet, ich könnte diesen Parameter in meine Dateiliste wie "document (file1.xml) | document (file2.xml)" einfügen, aber ich bin mir nicht sicher .... Ja, ich kann XSLT 2.0 verwenden Prozessor. Als du @ michael.hor257k –

+0

Ich verstehe nicht, was Ihre Frage ist, dann. Verwende entweder 'tokenize()' auf der '$ fileList', oder sieh dir die 'collection()' Funktion an. –

Antwort

1

So haben Sie zwei Aufgaben, in einer Reihe von Dateien zu lesen und sie zu verwandeln. Unter der Annahme, Saxon 9 als XSLT-Prozessor Sie

<xsl:template match="/"> 
    <xsl:copy> 
     <mes:Fichier xmlns:mes="message" > 
      <mes:Rcvr><xsl:value-of select="$Rcvr"/></mes:Rcvr> 
      <xsl:apply-templates select="@*|node()" /> 
     </mes:Fichier> 
    </xsl:copy> 
</xsl:template> 

mit

<xsl:template match="/"> 
     <mes:Fichier xmlns:mes="message" > 
      <mes:Rcvr><xsl:value-of select="$Rcvr"/></mes:Rcvr> 
      <xsl:apply-templates select="collection('.?select=file*.xml')/node()" /> 
     </mes:Fichier> 
</xsl:template> 

lesen und verarbeiten alle Dateien mit dem Namen file*.xml ersetzen können.

Dann für Ihre Transformation möchten Sie z.

<xsl:template match="*"> 
    <xsl:element name="doc:{local-name()}" namespace="Forward"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

Wenn mehr Namespace sind beteiligt Sie könnten das Match auf den Namespace beschränken müssen Sie das Präfix hinzufügen möchten. Und es ist sinnvoll, die Namespace-Deklaration des neuen Root-Elements in das Root-Element des Stylesheets zu verschieben.

+1

'collection' ist eine Funktion, die in XPath 2.0 und höher definiert ist und daher in XSLT 2.0 und höher und XQuery 1.0 und höher verfügbar ist. Dieses spezielle Argument zum Einlesen von Dateien ist Saxon 9 spezifisch, siehe http://saxonica.com/html/documentation/sourcedocs/collections.html. Eine datenbankorientierte Verwendung von "Sammlung" in z.B. BaseX oder Marklogic haben möglicherweise unterschiedliche Funktionen. –

+0

Siehe https://www.w3.org/TR/xquery-operators/#func-collection für die Definition der 'collection'-Funktion, aber wie gesagt, die Verwendung spezifischer URIs ist prozessorabhängig. –