Parameter mit XSLT setzen
Wenn Sie Parameter in einem XSLT-Style-Sheet verwenden möchten, deklarieren Sie sie direkt im Style-Sheet als globale Parameter.
Vorgehensweise
- Deklarieren Sie mit dem Attribut as einen Typ für den Parameter. Im folgenden Style-Sheet sind zwei Parameter deklariert. Für einen dieser Parameter ist explizit ein Typ angegeben.
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:param name="targetDate" as="xs:date"/> <xsl:param name="window" select="3"/> <xsl:template match="/"> <table> <tr><td>Task</td><td>Due</td><td>Status</td></tr> <xsl:apply-templates select="todo-list/task[xs:date(@due) le $targetDate + xs:dayTimeDuration(concat('P', $window, 'D'))]"> <xsl:sort select="@due"/> </xsl:apply-templates> </table> </xsl:template> <xsl:template match="task"> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="format-date(xs:date(@due), '[MNn] [D1o]')"/></td> <td> <xsl:choose> <xsl:when test="xs:date(@due) lt $targetDate">OVERDUE by <xsl:value-of select="days-from-duration($targetDate - xs:date(@due))"/> day(s)</xsl:when> <xsl:otherwise>Due in <xsl:value-of select="days-from-duration(xs:date(@due) - $targetDate)"/> day(s)</xsl:otherwise> </xsl:choose> </td> </tr> </xsl:template> </xsl:stylesheet>
- Sie können ein XSLT-Style-Sheet mit globalen Parametern genau wie jedes andere Style-Sheet vorbereiten, da im statischen Kontext nichts deklariert werden muss. Ist dieses Style-Sheet beispielsweise über das xsltSource-Source-Objekt verfügbar, bereitet der folgende Code das Style-Sheet vor.
// Factory erstellen XFactory factory = XFactory.newInstance(); // XSLT-Style-Sheet vorbereiten XSLTExecutable xslt = factory.prepareXSLT(xsltSource);
- Wenn Sie ein XSLT-Style-Sheet ausführen, das Parameter verwendet, geben Sie
mit einer XDynamicContext-Instanz supply-Werte (oder bind-Werte) für alle Parameter an.
Sie müssen für jeden erforderlichen Parameter einen Wert angeben. Andernfalls tritt ein Fehler auf. Wenn Sie für andere Parameter keinen Wert angeben, wird ein Standardwert verwendet, der im Style-Sheet oder in einer Zeichenfolge der Länge null angegeben ist.
Der XDynamicContext stellt eine Reihe von bind-, bindItem- und bindSequence-Methoden bereit. Jede dieser Methoden hat zwei Parameter, von denen der erste ein QName-Objekt für den Namen des Parameters und der zweite der Wert ist.Tabelle 1. bind-, bindItem- und bindSequence-Methoden von XDynamicContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der bind-, bindItem- und bindSequence-Methoden von XDynamicContext erläutert.
Methode Zweck bind Verwendung, wenn ein einzelner atomarer Wert gebunden werden soll Für jeden Java-Typ, der in der Standardzuordnung von integrierten Typen zu Java™-Typen verwendet wird, gibt es eine Variante dieser Methode. Darüber hinaus gibt es zwei Varianten, von denen eine ein Node-Objekt und die andere ein Source-Objekt verwendet. Diese Varianten werden zum einen für die Bindung eines beliebigen Knotens aus einer DOM-Struktur verwendet und zum anderen für die Syntaxanalyse einer neuen Quelle, um einen Dokumentknoten zu erhalten.
bindItem Verwendung, wenn ein einzelnes Element als XItemView-Objekt gebunden werden soll Ein XItemView-Objekt kann aus dem Ergebnis der Ausführung eines anderen Ausdrucks angefordert oder mit einer XItemFactory-Instanz konstruiert werden.
bindSequence Verwendung, wenn Sequenzen mit weniger oder mehr als einem Element gebunden werden sollen Für jeden Java-Typ, der in der Standardzuordnung von integrierten Typen zu Java-Typen verwendet wird, gibt es eine Variante dieser Methode, die jeweils ein Array mit Werten des gegebenen Typs akzeptiert.
Es gibt noch eine weitere Variante, die einen XSequenceCursor verwendet. Ein XSequenceCursor kann das Ergebnis der Ausführung eines anderen Ausdrucks sein oder mit einer XItemFactory-Instanz konstruiert werden.
Im folgenden Beispiel wird das im ersten Beispiel vorbereitete XSLT-Style-Sheet ausgeführt. Dabei werden zunächst die Werte für jeden verwendeten Parameter gebunden. Es wird vorausgesetzt, dass bereits ein Result-Objekt mit der Bezeichnung xsltResult erstellt wurde.// Create an xs:date value for the "targetDate" parameter with date "April 10, 2009" XMLGregorianCalendar date = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(2009, 4, 10, DatatypeConstants.FIELD_UNDEFINED); // Neuen dynamischen Kontext aus der Factory erstellen XDynamicContext dynamicContext = factory.newDynamicContext(); // Atomaren Wert für den Parameter "targetDate" binden dynamicContext.bind(new QName("targetDate"), date); // Atomaren Wert für den Parameter "window" binden dynamicContext.bind(new QName("window"), 7); // XML-Eingabedokument erstellen String xml = "<todo-list>" + "<task due='2009-03-31' completed=''>File Quarterly Report</task>" + "<task due='2009-05-04' completed='2009-04-22'>Review candidate resumes</task> + "<task due='2009-04-16' completed=''>Order stock</task>" + "<task due='2009-05-01' completed=''>Buy concert tickets</task>" + "</todo-list>"; StreamSource source = new StreamSource(new StringReader(xml)); // Style-Sheet ausführen xslt.execute(source, dynamicContext, xsltResult);


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_params_xslt
Dateiname:txml_params_xslt.html