2008-09-16 14 views
7

Ich habe ein XSLT-Stylesheet mit mehreren xsl:import s und ich möchte sie alle in die eine xslt-Datei zusammenführen.Mehrere xslt Stylesheets zusammenführen

Es ist eine Einschränkung des Systems, das wir verwenden, wenn es das XSL-Stylesheet als String-Objekt im Speicher durchläuft. Dies wird an die entfernte Maschine übertragen, wo sie die Transformation durchführt. Da die Href-Links nicht von der Festplatte geladen werden, sind sie defekt. Daher müssen wir die xsl:import s aus dem Stylesheet entfernen.

Gibt es irgendwelche Tools, die das können?

Antwort

15

Sie können ein XSL-Stylesheet verwenden, um Ihre Stylesheets zusammenzuführen. Dies entspricht jedoch der Verwendung des Elements xsl: include, nicht von xsl: import (wie bereits Azat Razetdinov ausgeführt hat). Sie können den Unterschied here nachlesen.

Daher sollten Sie zuerst die xsl: import mit xsl: include's ersetzen, Konflikte lösen und testen, ob Sie immer noch die richtigen Ergebnisse erhalten. Danach können Sie mit dem folgenden Stylesheet Ihre vorhandenen Stylesheets zu einem zusammenführen. Wenden Sie einfach es zu einem Master Sheet:

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

<xsl:template match="xsl:include"> 
    <xsl:copy-of select="document(@href)/xsl:stylesheet/*"/> 
</xsl:template> 

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

</xsl:stylesheet> 

Die erste Vorlage ersetzt alle xsl: include ist mit den mitgelieferten Stylesheets durch die Dokument-Funktion verwenden, die in der Datei im href-Attribut verwiesen liest. Die zweite Vorlage ist die identity transformation.

Ich habe es mit Xalan getestet und es scheint gut zu funktionieren.

+1

Dies scheint nicht zu funktionieren wenn enthält, wie unten relative Pfade haben: Irgendwelche auch für diese Szenarien? – Shiv

0

Warum möchten Sie? Sie sind normalerweise aus einem bestimmten Grund getrennt (oft Wartbarkeit).

Sie könnten immer die Zusammenführung selbst schreiben - lesen Sie die XSL-Dateien in, wählen Sie die Vorlage Elemente, die Sie interessiert sind und in eine neue Master-XSL-Datei schreiben.

+0

Benutzer erklärt: "(Die Datei ist) an entfernte Maschine übertragen, wo es die Transformation durchführt.Da es nicht von der Festplatte geladen wird, sind die href-Links " –

+0

ich bearbeitete die Frage, um den Grund zu enthalten. Seit dieser Antwort wurde vor dieser Änderung geschrieben. – roo

1

Eine manuelle Zusammenführung wird wahrscheinlich die beste Option sein.

Die Hauptüberlegung wird wahrscheinlich sein, sicherzustellen, dass die Logik für übereinstimmende Vorlagen im kombinierten Stylesheet funktioniert.

+0

Das ist, was ich hatte Angst: \ – roo

2

Es ist nicht möglich, importierte Stylesheets in die Hauptdatei einzufügen, ohne import precedence zu zerstören. Beispielsweise definieren Sie eine Top-Level-Variable in einem importierten Stylesheet und definieren sie in der Hauptdatei neu. Wenn Sie zwei Dateien zu einer zusammenführen, erhalten Sie zwei Variablen mit demselben Namen und derselben Importpriorität, was zu einem Fehler führt.

Die Problemumgehung ist zwei Ersetzen xsl: import mit xsl: include's und auflösen conflicts. Danach sind Sie sicher xsl zu ersetzen: include Anweisungen mit dem Inhalt entsprechenden Dateien, denn das ist, was XSLT-processor does:

Die Aufnahme in der XML-Struktur-Ebene arbeitet. Die vom href-Attributwert gefundene Ressource wird als XML-Dokument analysiert, und die untergeordneten Elemente des xsl: stylesheet-Elements in diesem Dokument ersetzen das xsl: include-Element im einschließenden Dokument. Die Tatsache, dass Vorlagenregeln oder Definitionen enthalten sind, hat keinen Einfluss auf die Art ihrer Verarbeitung.

-1
import multiple xsl in single xsl 

     <xsl:import href="FpML_FXOption_Trade_Template1.xsl"/> 
     <xsl:apply-imports/> 

<calypso:keyword> 
       <calypso:name>DisplayOptionStyle</calypso:name> 
<calypso:value>Vanilla</calypso:value> 
</calypso:keyword> 

      <xsl:import href="FpML_FXOption_Trade_Template2.xsl"/> 
      <xsl:apply-imports/> 
Verwandte Themen