使用 XSLT 设置参数
要在 XSLT 样式表中使用参数,请在该样式表本身中将参数声明为全局参数。
过程
- 使用 as 属性来声明参数的类型。 以下样式表声明两个参数,并显式地指定其中一个参数的类型。
<?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>
- 以准备任何其他样式表的完全相同方式准备包含全局参数的 XSLT 样式表,因为无需在静态上下文中声明任何内容。 假定使用 xsltSource 源对象可获得此样式表,以下代码准备该样式表。
// Create the factory XFactory factory = XFactory.newInstance(); // Prepare the XSLT stylesheet XSLTExecutable xslt = factory.prepareXSLT(xsltSource);
- 要执行使用参数的 XSLT 样式表,请使用 XDynamicContext 实例提供(或绑定)每个参数的值。
必须为所有的必需参数提供值,否则会发生错误。对于其他参数,如果您未提供值,那么会使用缺省值(样式表中提供的值或长度为零的字符串)。
XDynamicContext 具有若干 bind、bindItem 和 bindSequence 方法。每个方法都有两个参数,其中第一个参数是对应于参数名称的 QName 对象,第二个参数是值。表 1. XDynamicContext bind、bindItem 和 bindSequence 方法. 下表说明何时使用各种格式的 XDynamicContext bind、bindItem 和 bindSequence 方法。
方法 用途 bind 在绑定单个原子值时使用 对于内置类型到 Java™ 类型的标准映射中使用的每种 Java 类型,都存在一种格式的此方法。还存在两种其他的格式,其中一种格式接受节点对象,另一种格式接受源对象。这两种格式分别用于从 DOM 树绑定任何节点以及解析新的源代码以生成文档节点。
bindItem 在将单个项作为 XItemView 对象绑定时使用 XItemView 对象可以通过执行其他表达式获得,也可以使用 XItemFactory 实例来构造。
bindSequence 在绑定少于一个项或多于一个项的序列时使用 对于内置类型到 Java 类型的标准映射中使用的每种 Java 类型,都存在一种格式的此方法;每个方法都接受给定类型的值数组。
还存在另一种接受 XSequenceCursor 的格式。XSequenceCursor 可以通过执行其他表达式来生成,也可以使用 XItemFactory 实例来构造。
以下示例执行第一个示例中准备的 XSLT 样式表,并首先绑定它将使用的每个参数的值。假定已创建调用 xsltResult 的结果对象。// 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); // Create a new dynamic context from the factory XDynamicContext dynamicContext = factory.newDynamicContext(); // Bind an atomic value for the "targetDate" parameter dynamicContext.bind(new QName("targetDate"), date); // Bind an atomic value for the "window" parameter dynamicContext.bind(new QName("window"), 7); // Create an XML input document 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)); // Execute the stylesheet xslt.execute(source, dynamicContext, xsltResult);


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