通过DOMSource的JAXP Transformer返回样式表

时间:2012-08-29 09:03:35

标签: xml xslt jaxp

我遇到了一个奇怪的问题,似乎无法找到任何解决方案。我只是尝试将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的outputstream返回加载的样式表,而不是转换后的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>

谢谢!

威廉

1 个答案:

答案 0 :(得分:2)

您的DocumentBuilderFactory很可能不支持名称空间。尝试使用以下命令启用命名空间感知:

factory.setNamespaceAware(true);

您可以check out this post获取相关代码。