2016-03-23 15 views
0

Ich versuche, mehrere Dateien mit XSLT zu kombinieren und zu verarbeiten. Hier ist ein Beispiel für die Art von Struktur Ich arbeite mit:XSLT: Wie injiziere ich ein Dokument, dann tempates darauf anwenden?

seite.html

<html> 
    <head/> 
</html> 

head.html

<head> 
    <title /> 
</head> 

proc.xsl

<xsl:template match="/html/head"> 
    <xsl:apply-templates select="document('head.html')/head" /> 
</xsl:template> 

<xsl:template match="/head/title"> 
    <title>this is a contrived example</title> 
</xsl> 

I‘ m Anwendung proc.xsl gegen page.html. Alles funktioniert, aber beachten Sie, dass die Übereinstimmung im zweiten Vorlagenelement relativ zum eingeschlossenen Dokument sein muss, und nicht zu der, die es enthält. Ist das klug? Gibt es eine Möglichkeit sicherzustellen, dass die Anweisung apply-templates im Zusammenhang mit dem einschließenden Dokument und nicht mit dem eingeschlossenen Dokument ausgeführt wird?

Um zu klären, ist das Ergebnis die ich suche ist:

head.xsl

<xsl:template match="/html/head"> 
    <head> 
     <title /> 
    </head> 
</xsl:template> 

Nochmal:

<html> 
    <head> 
     <title>this is a contrived example</title> 
    </head> 
</html> 

ich auch mit einem xsl-Datei wie folgt umfassen/Import versucht , dies injiziert die Kopf Markup fein, aber das title Element verarbeitet nicht.

+0

Ich verstehe Ihre Frage nicht. Die Übereinstimmung in der zweiten Vorlage (oder in einer beliebigen Vorlage) ist nicht "relativ zum eingeschlossenen Dokument" (oder einem Dokument). Und die 'apply-templates'-Anweisung funktioniert in dem Kontext, in dem sie aufgerufen wird; in Ihrem Beispiel im Kontext von '/ html/head' des Dokuments' page.html' - weil das der Kontext ist, der von der übergeordneten Vorlage festgelegt wird. Was ist das eigentliche Problem hier? –

+0

Entschuldigung, ich bin sicher, dass die Terminologie weit entfernt ist. Was ich meine ist, dass der xpath-Ausdruck in der Übereinstimmung mit '/ head' anstatt mit'/html' beginnen muss, d. H. Er stimmt mit dem geladenen Dokument überein und nicht mit dem Ergebnis der Anwendung der ersten Vorlage auf das ursprüngliche Dokument. Ich werde mit einem Beispiel für das Ergebnis, das ich möchte, aktualisieren. –

+0

Sie können die Template-Übereinstimmung einfach auf 'match =" head/title "' oder nur 'match =" title "' ändern, denn dann ist es egal, ob 'head' das Wurzelelement ist oder nicht. –

Antwort

0

Sie legen niemals Dokument ('head.html')/head Element in das aktuelle Dokument (oder ein Dokument, wo es nicht Wurzelelement ist), so ist es seltsam zu erwarten, dass es als/html/head interpretiert wird .

Jetzt können Sie dieses Element wahrscheinlich in ein anderes Dokument kopieren und dann Vorlagen darauf anwenden, wenn Sie dieses Verhalten wirklich wollen.

<xsl:variable name="head"> 
    <html> 
     <xsl:copy-of select="document('head.html')/head" /> 
    </html> 
</xsl:variable> 

<xsl:apply-templates select="exsl:node-set($head)/html/head"/> 

vielleicht?

+0

Kannst du erklären "Du platzierst nie ein Dokument ('head.html')/head Element" ...?Ich dachte, was ich gerade tat, tat genau das. Ich weiß, dass dies nicht der "Xslt-Weg" ist, aber ich hätte gedacht, dass das Kombinieren mehrerer Dokumente ein allgemein genug Anwendungsfall wäre, der irgendwie unterstützt würde. –

+0

Die Funktion document() enthält kein anderes dokumentverarbeitetes Dokument, sondern analysiert es lediglich als separate Knotenmenge. Ich glaube nicht, dass es dem zu bearbeitenden Dokument etwas hinzufügen kann, es ist unveränderlich. geparstes Dokument (Knotensatz) ist nirgendwo enthalten und steht in keinem Zusammenhang mit einem anderen Dokument (Eingabe oder Ausgabe) – alamar

Verwandte Themen