关于 java:REST 服务:如何使用 XML XSLT 生成人类可读的输出?
REST service: how to produce human readable output using XML + XSLT?
我在 GlassFish 中使用 Jersey 实现了一个 REST 服务。我有使用 JSON 输出的服务,现在我也想提供一些人类可读的输出。 JSON 输出中缺少的最重要的事情是我希望将统计信息中的某些字段转换为可点击的链接,这将显示相??关的统计信息(使用另一个 REST 调用)。
因为我想保持格式和内容分开,我不想直接生成 HTML。我虽然使用 xml xslt 可能是一种明智的方法。我可以使用 org.w3c.dom 生成 XML 文档,但我看不出如何将 xslt 附加到它。
这大概是我现在所做的:
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
@GET
@Path("history_id") @Produces("application/xml") public Document history(@QueryParam("id") String idText) throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = factory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); Element root = doc.createElement("root"); doc.appendChild(root); Element el = doc.createElement(name); el.setTextContent(value); root.appendChild(el); return doc; |
我希望在生成的 XML 中出现以下指令:
|
1
|
<?xml-stylesheet type="text/xsl" href="history.xsl"?">
|
如何指定要附加到 XML 的 xslt?还是我的方法可能从根本上是错误的,而这通常以其他方式完成?
相关讨论
- 只是出于兴趣,为什么要以人类可读的方式显示 XML?是为了在网页的一部分中显示(例如作为 API 可视化工具的一部分,即 Swagger 类型的方法)还是出于其他原因?
- @My Head Hurts 我想生成一些统计信息,这些统计信息可能会被应用程序使用(我目前使用 JSON),但有时它们也可能会被人类检查,为此我想添加一些格式(最重要的是在某些字段上实现可点击链接以显示相关统计信息)以方便使用。
- @MyHeadHurts 应该可以提供带有 XSLT 样式表的 XML 网页,并且 Web 浏览器应该能够在其一侧进行转换和格式化,位于 w3schools.com/xml/simplexsl.xml 中。我知道我可以在服务器上进行转换,但不知何故,这感觉像是一个劣质的解决方案。
- 您是否考虑过使用 JAXB 从同一个域对象生成 XML 和 JSON?看看 blog.bdoughan.com/2012/11/... 和 stackoverflow.com/a/11012294/116509
- @artbristol 对于许多场景来说,这似乎是一种合理的方式,但它似乎不太符合我的目的。 1)我的输出不直接对应于数据库对象,我输出了一些汇总的统计信息,而不是对象本身。 2) 这似乎生成 HTML,而不是 XML。
- @MyHeadHurts 我正在尝试在提供的链接中实现解决方案,但我没有看到任何附加到转换生成的 DOM 的 XSLT。我会多研究一下以了解它。如果这有效,它可能是一个答案。
- @MyHeadHurts 我没有看到示例中附加了任何 xslt。我不确定我是否理解正确,但唯一的输出属性集是使用 transformer.setOutputProperty("{xml.apache.org/xslt}indent-a??mount", "4"); - 我错过了什么吗?
该"指令"在 XML 世界中称为"处理指令"。您可以使用 DOM API 创建一个:
|
1
2 3 4 |
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); doc.appendChild(doc.createProcessingInstruction("xml-stylesheet","type="text/xsl" href="https://www.codenong.com/13680793/history.xsl"")); |
然后,如果您将 XML 文档发送到支持客户端 XSLT 的浏览器/用户代理,它会将样式表应用到 XML。