Antwort Dougs ist technisch korrekt, und er hat mich auf dem richtigen Weg der Suche nach der nodeset Erweiterungsfunktion (danke!). Der einzige Unterschied ist, dass ich den Xalan-java Prozessor anstelle von Microsoft verwende. Hier ist eine Arbeits (sehr einfach) Beispiel dafür, was ich versuche, achive:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan">
<xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="label">
<b><xsl:value-of select="." /></b>
</xsl:template>
<xsl:template name="someTemplate">
<root>
<label>hey there</label>
</root>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="gen">
<xsl:call-template name="someTemplate" />
</xsl:variable>
<xsl:apply-templates select="xalan:nodeset($gen)//label" />
</xsl:template>
</xsl:stylesheet>
Die Grundidee ist, dass Sie eine Variable erstellen (hier genannt „gen“), die eine Vorlage nennt („someTemplate“), das erstellt einige XML. Dieser XML-Baum wird dann von der Funktion xalan: nodeset verarbeitet. Hier führe ich Apply-Templates aus und bearbeite alle Label-Felder, die mit meiner Label-Vorlage übereinstimmen und das fett gedruckte Label erstellen.
Der Grund, warum ich das alles mache, ist, weil ich an einer Web-App arbeite, wo der gesamte Inhalt auf jeder Seite in XML definiert und dann mit XSL verarbeitet wird. Das funktioniert großartig, bis Sie Teile der Seite mit den Ergebnissen eines AJAX-Aufrufs füllen wollen, denn dann müssen Sie entweder das neue HTML innerhalb einer JavaScript-Funktion aus dem zurückgegebenen XML (unordentlich und fehlerhaft) erstellen oder die AJAX-XML-Antwort weiterleiten eine XSL-Transformation auf der Serverseite und fügen Sie einfach das xhtml-Ergebnis in die Seite ein.
In meiner Situation, weil ich jede Webseite in XML beschreibe, habe ich einfache, generische Elemente erstellt, die "Typen" haben. Meine Elemente sind "Block", das ist ein beliebiger Inhaltsblock. Ein Block kann Unterknoten wie "Schaltfläche" (die eine Verknüpfung oder Schaltfläche ist), "Liste" (die mehrere Blöcke ist), "Bild" oder "Eingabe" haben. Die Details des Schemas sind irrelevant; Ich wollte nur zeigen, dass mein XML-Schema sehr einfach und generisch ist.
Auf der anderen Seite wird die AJAX XML-Antwort, die ich zum Aktualisieren/Aufbau der Seite abrufe, von einem Drittanbieter erstellt, der mein Schema nicht verwendet. Im Gegenteil, jeder Service, den sie bereitstellen, gibt für jede eindeutige Anfrage ein sehr spezifisches XML zurück. Aus diesem Grund brauche ich eine Möglichkeit, um ihre sehr spezifische XML in meine sehr generische XML zu konvertieren, so dass ich sie mit einem einzigen Satz von XSL-Vorlagen transformieren kann.
Hier ist ein Beispiel für eine der xsl-Vorlagen, die ich jetzt verwende, die die AJAX-Antwort transformiert und ihre spezifische XML in meine generische XML konvertiert.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan">
<xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes"/>
<!-- base.xsl includes a generic template that matches all blocks and routes
to the needed template based on the block type -->
<xsl:include href="base.xsl" />
<xsl:template name="templateForAJAXResponse">
<block>
<type>list</type>
<list>
<type>itemBrowser</type>
<xsl:for-each select="/response/items/item">
<block>
<type>button</type>
<button>
<type>imageButton</type>
<href>something.action</href>
<src><xsl:value-of select="src" /></src>
<title><xsl:value-of select="name" /></title>
</button>
</block>
</xsl:for-each>
</list>
</block>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="gen">
<xsl:call-template name="templateForAJAXResponse" />
</xsl:variable>
<div>
<xsl:apply-templates select="xalan:nodeset($gen)/block" />
</div>
</xsl:template>
</xsl:stylesheet>
Danke für die Antwort, Doug. Dies brachte mich auf den richtigen Weg und ich konnte eine Lösung für mein tatsächliches Problem finden, detailliert in meiner eigenen Antwort, die ich gepostet habe. –