xsl调用java方法传参_Java中的XSL转换:一种简单的方法

xsl调用java方法传参

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的帮助下进行的 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

xsl调用java方法传参

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 运算符和语句总结

运算符&#xff1a; C 表达式中的左值和右值&#xff1a;当一个对象被用作左值时&#xff0c;用的是对象的身份&#xff08;内存中的位置&#xff09;。当作为右值时&#xff0c;用的是对象的值&#xff08;内容&#xff09;。或者说&#xff0c;lvalue:具有存贮性质的对象&…

# 遍历结构体_C#学习笔记05--枚举/结构体

一.枚举当变量的取值范围是固定的几个, 例如性别--男,女; 英雄类型 -- 法师, 刺客.战士, 射手等等. 这时就可以使用枚举类型, 会更加简洁方便.1.1.定义:访问修饰符 enum 枚举类型名 {成员1,成员2,成员3,... }public enum Days{Mon 1,Tue,Wed,Thu,Fri,Sat,Sun}enum: 是枚举的…

单例嵌套 ios_嵌套类型的前5个用例

单例嵌套 ios前几天&#xff0c;关于reddit进行了有趣的讨论&#xff0c;即静态内部类。 什么时候太多&#xff1f; 首先&#xff0c;让我们回顾一下Java的基本历史知识。 Java语言提供了四个级别的嵌套类 &#xff0c;通过“ Java语言”&#xff0c;我的意思是这些构造仅是“…

C语言中枚举enum的用法

本文举例说明C语言中enum枚举关键字的用法。用来同时定义多个常量利用enum定义月份的例子如下。#include enum week {Mon1,Tue,Wed,Thu,Fri,Sat,Sun}; int main() {printf("%d",Tue); return 0; }这样定义Mon的值为1之后&#xff0c;Tue的值就被默认定义为2&#…

苹果更新未知错误17_iOS 13 新功能,静音未知来电

果粉俱乐部让科技更好的服务生活点击上方「蓝字」加入我们iOS 13 正式版系统已经推出了快三周时间&#xff0c;苹果在新系统当中带来了诸多功能改进&#xff0c;包括大家盼望已久的深色模式&#xff0c;新的音量调节设置&#xff0c;自定义流量下载限制等等。除此之外&#xff…

C/C 语言中extern的用法

声明外部变量现代编译器一般采用按文件编译的方式&#xff0c;因此在编译时&#xff0c;各个文件中定义的全局变量是互相透明的&#xff0c;也就是说&#xff0c;在编译时&#xff0c;全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程&#xff0c;里面含有…

设置公共请求参数_封装一个useFetch实现页面销毁取消请求

前端业务经常会出现这样一类问题&#xff0c;当用户网速过慢或是其他特殊情况下&#xff0c;该页面的请求还未完成&#xff0c;用户就已经点击其他页面跳出去了。理想状态下请求也是应该终止掉的&#xff0c;所以我们应该想办法将请求和页面卸载关联在一起。1 使用AbortControl…

rx 异步执行耗时_使用rx-java的异步抽象

rx 异步执行耗时对我而言&#xff0c;使用Rx-java的一大好处是&#xff0c;无论底层调用是同步还是异步&#xff0c;因此代码看起来都完全相同&#xff0c;因此该条目的标题也是如此。 考虑一个非常简单的客户代码用例&#xff0c;它执行三个缓慢运行的调用并将结果合并到一个…

C语言中return的各种用法

按初学的理解&#xff0c;return的任务就是返回对应的参数&#xff0c;在外层函数中对这个参数做进一步处理。实际上return的用法不只这些。为调用的函数返回参数值此类应用最为普遍&#xff0c;通常是在一个具有返回值的函数中&#xff0c;返回一个参数值&#xff0c;这个返回…

代码内查找函数引用_叮~~二级操作题 excel常考函数大梳理

1.AND函数格式&#xff1a;AND(logical1,logical2…)功能&#xff1a;and函数是一个逻辑函数&#xff0c;表示同时满足多个条件。通常配合if函数做条件判断&#xff0c;得值为true或者是false。2.OR函数格式&#xff1a;OR(logical1,logical2…)功能&#xff1a;or函数是一个逻…

hazelcast入门教程_Hazelcast入门指南第6部分

hazelcast入门教程这是有关Hazelcast的一系列文章中的第六篇。 如果一个人没有看过过去的五年&#xff0c;请到表中的内容后 &#xff0c;我创建赶上。 本地客户 在上一篇文章之后&#xff0c;我决定要去本地化。 是的&#xff0c;我将演示Hazelcast自己的Java客户端。 Java不…

总结C语言中的数组知识点

数组&#xff1a;只能存放一种数据类型&#xff0c;比如int类型的数组、float类型的数组&#xff0c;里面存放的数据称为“元素”。数组的定义&#xff1a;首先声明数组的类型&#xff0c;然后声明数组元素的个数&#xff0c;也就是定义需要多少存储空间。数组格式与初始化格式…

python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?

都2020年了居然还有人在学python&#xff1f;学python有什么用&#xff1f;真是气抖冷啊&#xff01;想学习python的小伙伴&#xff0c;可以加裙595227871 领取免费的学习资料为什么选择python&#xff1f;1.行业人才的需求 在过去五年里&#xff0c;呈现出爆发性增长的趋势。今…

主要矛盾和次要矛盾_次要GC,主要GC与完整GC

主要矛盾和次要矛盾在使用Plumbr中的GC暂停检测功能时&#xff0c;我被迫通过大量有关该主题的文章&#xff0c;书籍和演示工作。 在整个旅程中&#xff0c;我多次对次要&#xff0c;主要和完全GC事件的使用&#xff08;误用&#xff09;感到困惑。 这导致了这篇博客文章&#…

action mutation 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

module与moduleCollection你一定要会啊&#xff01;Vuex源码学习(五)加工后的module在组件中使用vuex的dispatch和commit的时候&#xff0c;我们只要把action、mutation注册好&#xff0c;通过dispatch、commit调用一下方法名就可以做到。使用方式vue组件内//in vue componentt…

grunt 插件_从Grunt测试Grunt插件

grunt 插件编写针对grunt插件的测试结果比预期的要简单。 我需要运行多个任务配置&#xff0c;并想通过在主目录中键入grunt test来调用它们。 在第一个任务失败后&#xff0c;咕声通常会退出。 这使得不可能在主项目gruntfile中存储多个失败方案。 从那里运行它们将需要--for…

​嵌入式开发为什么选择C语言?

从语言特点来说C语言有出色的可移植性&#xff0c;能在多种不同体系结构的软/硬平台上运行。简洁紧凑&#xff0c;使用灵活的语法机制&#xff0c;并能直接访问硬件能够直接访问硬件的语言有&#xff1a;汇编和C语言汇编属于低级语言&#xff0c;难以完成一些复杂的功能&#x…

mysql 临时表 heap_mysql优化: 内存表和临时表

由于直接使用临时表来创建中间表&#xff0c;其速度不如人意&#xff0c;因而就有了把临时表建成内存表的想法。但内存表和临时表的区别且并不熟悉&#xff0c;需要查找资料了。一开始以为临时表是创建后存在&#xff0c;当连接断开时临时表就会被删除&#xff0c;即临时表是存…

序列化与反序列化的单例模式_序列化代理模式

序列化与反序列化的单例模式在上一篇文章中 &#xff0c;我谈到了一般的序列化。 这是更加集中的内容&#xff0c;并提供了一个细节&#xff1a; 序列化代理模式 。 这是处理序列化中许多问题的一种好方法&#xff0c;通常是最好的方法。 如果开发人员只想了解这一主题&#xf…

图解C语言的希尔排序

希尔排序是插入排序的一种&#xff0c;又称“缩小增量排序”&#xff0c;希尔排序是直接插入排序算法的一种更高效的改进版本。希尔排序的基本思想设等待排序等元素序列有n个元素&#xff0c;首先取一个整数increment&#xff08;小于n&#xff09;作为间隔将全部元素分为n/inc…