Java中的XSL转换:一种简单的方法

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值