对结果进行序列化
在您的应用程序已对 XPath 或 XQuery 表达式进行求值后,或已对 XSLT 样式表执行变换后,您可能希望将输出编写为以文件或 Java™ 字符串表示的实际 XML 文档。 将结果呈现为 XML 文档的过程称为序列化。
过程
- 序列化 XSequenceCursor。
您的应用程序可以调用 XSequenceCursor.exportSequence 方法,以序列化由 XSequenceCursor 接口的实例表示的序列。此方法上的自变量是 javax.xml.transform.Result 接口的实例,也可以是 XOutputParameters 接口的实例。
如果 Result 接口的实例也是 javax.xml.transform.stream.StreamResult 类的实例,那么会如 XSLT 2.0 and XQuery 1.0 Serialization Recommendation 中所描述对序列进行序列化。StreamResult 对象可以包含 java.io.Writer 类或 java.io.OutputStream 类的实例,其中,处理器将写入序列化的序列。
您可以通过调用 XFactory.newOutputParameters() 创建 XOutputParameters 接口的实例,并在此对象上调用方法来覆盖缺省序列化参数设置。XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath("/purchaseOrder/item[@price > 1000]"); XSequenceCursor exprResult = expr.execute(new StreamSource(inputFile)); System.out.println("Items purchased costing more than $1000"); if (exprResult != null) { // Set indenting in order to pretty-print result XOutputParameters params = factory.newOutputParameters(); params.setIndent(true); exprResult.exportSequence(new StreamResult(System.out), params); } else { System.out.println("None found"); }
您还可以在 XSLTExecutable 接口的实例上调用其中一种 getOutputParameters() 方法,获取与 XSLT 样式表中特定 output definition 关联的序列化参数。使用 XSLTExecutable.getOutputParameters(javax.xml.namespace.QName) 方法以获取已命名输出定义的序列化参数,或使用非自变量 XSLTExecutable.getOutputParameters() 方法以获取未命名输出定义的序列化参数。您可能希望执行此操作,以对变换的结果执行某些后处理,同时使用此变换在序列化结果之前生成的 XSequenceCursor 接口的实例。如果在其中一种 XSLTExecutable.getOutputParameters() 方法返回的 XOutputParameters 接口的实例中,更改序列化参数的设置,那么将不会影响样式表中的输出定义。XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"); XOutputParameters params = style.getOutputParameters(new QName("my-output-definition")); params.setMethod(XOutputParameters.METHOD_XHTML); xformResult.exportSequence(new StreamResult("output.html"), params);
请注意,根据 XSLT 2.0 and XQuery 1.0 Serialization Recommendation,如果要序列化的序列包含属性节点或名称空间节点,那么会导致序列化错误。如果需要序列化的序列可包含属性或名称空间节点,那么获取这些节点的值(字符串或某个其他相应类型),并改为对这些值进行序列化。
- 序列化单个项。
您还可以通过使用其中一种 exportItem 方法,在 XSequenceCursor 接口的实例中仅序列化当前项。exportItem 方法继承自 XItemView 接口,因此也可以在此接口的实例上调用这些方法。
与前面描述的 exportSequence 方法一样,exportItem 方法的自变量是 javax.xml.transform.Result 接口的实例以及(可选)XOutputParameters 接口的实例。调用 exportItem 的影响与对仅包含当前项的序列调用 exportSequence 的影响相同。
- 直接序列化变换或查询的结果。 您的应用程序还可以通过对 XSLTExecutable.execute 方法或 XQueryExecutable.execute 方法提供 javax.xml.transform.Result 接口的实例,直接序列化 XSLT 变换或 XQuery 表达式的结果。序列化参数设置由任何适用 xsl:output 声明或 xsl:result-document 指令的属性确定(如果是 XSLT 样式表),且始终为缺省值(如果是 XQuery 表达式的结果)。
XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); style.execute(new StreamSource("purchase.xml"), new StreamResult("output.xml"));
如果您的应用程序对变换提供了 XResultResolver 接口的实例,那么它可以将每个最终结果树定向到其他目标。
- 使用标识变换。
您可以使用 XML API,以直接将 javax.xml.transform.Source 的实例中包含的 XML 数据变换为 javax.xml.transform.Result 的实例。这通常称为标识变换。请参阅执行基本 XSLT 操作,以获取示例。


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