XSL转换 (XSLT)是将一个XML文档转换为另一个XML文档的强大机制。 但是,在Java中,XML操作相当冗长和复杂。 即使是简单的XSL转换,也必须编写几十行代码—如果需要适当的异常处理和日志记录,甚至可能还要写更多的代码。 jcabi-xml是一个小型开放源代码库,它通过使用一些简单的方法启用XML解析和XPath遍历,使生活变得更加轻松。 让我们看看该库如何帮助XSL转换。
首先,看一个实际的示例— rultor.com ,这是一个托管的DevOps助手,可自动执行发布,合并和部署操作。 Rultor在DynamoDB记录中与最终用户保持每次对话会话(也称为“对话”)。 每次谈话有多种情况需要处理。 这就是为什么使用记录的多列实际上不可行的原因。 相反,我们只将每个对话的几个参数保留在记录列中(例如ID和名称),并将所有其余参数放在一个XML列中。
这大约是我们的DynamoDB表的外观:
+----+---------------+--------------------------------------+
| id | name | xml |
+----+---------------+--------------------------------------+
| 12 | jcabi-xml#54 | <?xml version='1.0'?> |
| | | <talk public="true"> |
| | | <request id="e5f4b3">...</request> |
| | | </talk> |
+----+---------------+--------------------------------------+
| 13 | jcabi-email#2 | <?xml version='1.0'?> |
| | | <talk public="true"> |
| | | <daemon id="f787fe">...</daemon> |
| | | </talk> |
+----+---------------+--------------------------------------+
用户将@rultor status
到Github票证后,Rultor必须回答有关当前谈话的完整状态报告。 为了创建这样的文本答案(普通用户不会喜欢XML响应),我们必须从必要的DynamoDB记录中获取该xml
列,并将其转换为纯英文文本。
这是我们在jcabi-xml及其类XSLDocument
的帮助下进行的 。
final String xml = // comes from DynamoDB
final XSL xsl = new XSLDocument(
this.getClass().getResourceAsStream("status.xsl")
);
final String text = xsl.applyTo(xml);
而已。 现在,让我们看一下status.xsl
文件中的内容(这只是它的骨架;完整版本在这里 ):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text"/>
<xsl:template match="/talk">
<xsl:text>Hi, here is your status report:</xsl:text>
...
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
优良作法是每个应用程序运行仅创建一次XSL文档。 我们有一个静态实用程序方法XSLDocument.make()
:
final class Foo {
private static final XSL STYLESHEET = XSLDocument.make(
Foo.class.getResourceAsStream("stylesheet.xsl")
);
public XML style(final XML xml) {
return Foo.STYLESHEET.transform(xml);
}
}
请注意我们正在使用XSLT 2.0的事实。 XSLT的内置Java实现不支持2.0版,为了使其运行,我们使用了以下两个Maven Saxon依赖项:
<dependency>
<groupId>net.sourceforge.saxon</groupId>
<artifactId>saxon</artifactId>
<version>9.1.0.8</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.saxon</groupId>
<artifactId>saxon</artifactId>
<version>9.1.0.8</version>
<classifier>xpath</classifier>
<scope>runtime</scope>
</dependency>
开始使用jcabi-xml
进行XSL转换所需要做的就是将此依赖项添加到pom.xml
:
<dependency>
<groupId>com.jcabi</groupId>
<artifactId>jcabi-xml</artifactId>
</dependency>
如果您有任何问题或建议,请随时将问题提交给Github 问题跟踪器 。
翻译自: https://www.javacodegeeks.com/2015/02/xsl-transformation-java-easy-way.html