我遇到了一个奇怪的问题,似乎找不到任何解决方案。我只是试图将 XSLT 样式表应用于 XML 文件(在这种情况下,SPARQL 查询结果格式化为 XML,但任何其他 XML 文件都会给出相同的结果)。在这种情况下,我需要通过 DOMSource 重新使用已加载的 XML 文档来创建转换器。您可以在下面找到代码(简化;通常,样式表文档来自其他地方):
TransformerFactory factory = TransformerFactory.newInstance();
Document stylesheet = db.parse(new File("C:/workspace_5/stylesheet.xml"));
Transformer xformer = factory.newTransformer(new DOMSource(stylesheet));
Source source = new StreamSource(new FileInputStream("C:/workspace_5/xml-file.xml"));
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
Result result = new StreamResult(bOut);
xformer.transform(source, result);
StreamResult 的输出流返回加载的样式表,而不是转换后的 XML。如果我将第二行和第三行替换为:
Transformer xformer = factory.newTransformer(new StreamSource(
new FileInputStream(""C:/workspace_5/stylesheet.xml")));
然后一切正常。是的,当然我可以将加载的样式表文档序列化为字符串,将其转换为 ByteArrayInputStream(或者更糟糕的是,将其写入文件),然后使用它来创建 StreamSource,但这很愚蠢。
有什么原因这不起作用吗?
xml-file.xml 代码:
<?xml version="1.0"?>
<sparql>
<head>
<variable name="buyerName"/>
</head>
<results>
<result>
<binding name="buyerName">
<literal>John Doe</literal>
</binding>
</result>
</results>
</sparql>
stylesheet.xml 代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:po="http://www.w3.org/2002/ws/sawsdl/spec/wsdl/order#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:template match="/sparql">
<xsl:for-each select="results/result">
<buyer xsi:type="po:Buyer">
<name xsi:type="string"><xsl:value-of select="binding[@name='buyerName']/literal" /></name>
</buyer>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
谢谢!
威廉