XSLT 调用 Java 的类方法 -- Tomcat 环境

很早很久以前写过一篇 在 xslt 调用 java 方法的日志 XSLT 调用 Java 的类方法, 其中介绍是使用 org.apache.xalan.processor.TransformerFactoryImpl 实现的例子,JDK 本身就是用这个的。但是在 Tomcat 环境下,它有它自己的 XSLT 默认实现是 net.sf.saxon.TransformerFactoryImpl,这时候 XSLT 中的内容略有不同,而且显示更简便一些。

这么说吧, xalan 支持以下两种调用 java 方法的方式,而 saxon 只认得第二种

1. 声明到包,调用时带上类名

阅读全文 >>

Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容(终结)

前面两篇:Struts2 使用 XSLTResult 输出页面内容详解 和 Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容 对 Struts2 如何使用 xslt 结果和怎么把字符串直接作为 Document 内容进行的讲解、研究和探讨。关于 Action 中的字符怎么直接作为 xslt 的内容已有一种方法,就是把 String 转换成 org.w3c.dom.Document 类型再送给 xslt 文件。

同时也发现 Struts2 使用了 org.apache.struts2.views.xslt.StringAdapter 了对字符串的处理,并提供了 parseStringAsXML 的开关选项(虽然是无从设置它的值),但即使把 parseStringAsXML 设置成了 true,送给 xslt 文件的内容也是被包裹上了 <result> 根节点,xslt 中不得不用 <xsl:template match="/result/你的根节点"> 来应用模板。

通过在上一篇 Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容 里琢磨来琢磨去的探寻,着实又走了不少弯路,甚至是误入了歧途,但终究是找到了一个较好的办法来让 Action 直接送 String 表示的 Document 给 xslt 文件。那就是自定义 StringXSLTResult, 阅读全文 >>

Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容

在上一篇: Struts2 使用 XSLTResult 输出页面内容详解 中说到了,如果在 Action 中送给 xstl 的是一个字符串,例如 String user = "<user><name>Unmi</name></user>",那么 xslt result 输出的将是:

<result>
&lt;user&gt;&lt;name&gt;Unmi&lt;/name&gt;&lt;/user&gt;
</result>

而不我们期望的

<user>
<name>Unmi</name>
</user>

那么怎么才能做到这一点呢?在 XSLTResult 有 adapterFactory 以及相应的 setter/getter 方法,但它们是 protected,所以也无法定制自己的 AdapterFactory 来判断是字符串就作为 Document 的内容。 阅读全文 >>

Struts2 使用 XSLTResult 输出页面内容详解

Struts2 内置提供了 xslt 结果类型,实现类为 org.apache.struts2.views.xslt.XSLTResult,它让你方便的把获得的 XML 数据内容,或者是用 OGNL 能访问到的某个属性(像 ContenxtMap、Request 等中的属性),通过一个 xslt 文件转换成你想要的格式。前面这句听来不怎么明白,后面慢慢道来。

在 Struts2 的 struts-default.xml 中定义了 chain、dispatcher、freemarker、httpheader、redirect、redirectAction、stream、velocity、xslt 和 plainText 10 种类型的 Result;而在 Struts2 初期版本中的 jasper、chart、jsf 和 tiles 结果类型已移到相应的插件去实现了。

freemarker、velocity 和 xslt 可以很自由的使用各自的模板语言,velocity 渐渐淡出了我们的视野,那还剩下 freemarker 和 xslt。freemarker 要求实合并的变量是实体类型,满足了多数时候的需求,不过现在要说的 xslt 结果类型,向 xslt 文件送去的数据可以是实体类型,也可以是原生的 org.w3c.dom.Document 类型,当然到了 xslt 文件这一层处理的都是 阅读全文 >>

XSLT 调用 Java 的类方法

曾经有两篇介绍了在 XSLT 里如何调用 C# 或 Js 写的函数,其中用到了与微软相关的,像:xmlns:msxsl="urn:schemas-microsoft-com:xslt",  <msxsl:script implements-prefix="unmifn" language="C#">。回到了 Java 环境同样得考虑在 XSLT 中如何调用 Java 的方法,毕竟在 XSLT 外处理内容要方便许多。

参考了一些网上的文章,大多讲的不怎么好理解与应用,未尝试之前不免让人想缩手。其实做起来可以更简单些,两步而已:

1) 声明时指定包名和函数前缀
2) 调用时加上前缀和类名及静态方法,传入参数

要想再深入些,可注意有时候 Java 函数应该传入的参数类型是什么?是否能调用非静态方法,public 是最基本的要求,以及通过什么组件来调用的等等。 阅读全文 >>

XSLT 中用 JavaScript 自定义函数处理参数

曾经写过一篇 XSLT 文件中使用C#/JScript/VB 自定义函数 怎么用 C#/JScript/VB 在 XSL/XSLT 中自定义函数。那时候原本想直接用 JavaScript 来自定义函数,因为 JavaScript 哪台机器上都能跑,但出了些问题,所以实际中是用的 C# 自定义的 XSLT 函数。

这样的问题无论从哪方面讲都一直回避不了,情况是如果在 JavaScript 定义函数中直接把传入的参数返回是没问题的,但要作任何的处理,或者调用 JS 函数都会失败。XSLT 中的自定义函数,不对参数进行加工处理是没有意义的。比如在 XSLT 中写如下函数: 阅读全文 >>

XSLT 生成 XML 中带 CDATA 的节点

原来曾经都是用代码或是像 Velocity 样的模板来转换生成 XML的,自从接触了 XSLT 后,已把它当成了 XML 到其他许多数据格式的不二之选了。有时候因为特殊字符等因素,需要转换后的数据在新节点中用 <![CDATA[...]]> 包裹起来更好看且不易出错,或者还需对生成的 XML 进一步处理时,用 <![[CDATA[...]]> 会更保险些 。

通常我们在 xslt 文件中会这么写:

<description><xsl:value-of select="Description"/></description>

如果原来的 Description 中有特殊字符,如 < 等,转换后,< 会自动变为 &lt; 的,即得到

<description>Hello&lt;Unmi</description> 阅读全文 >>

XSLT 中使用参数和变量以及 C# 向 XSLT 传入参数

有时候我们需要向 XSLT 中设定或传入参数或变量,比如用 XSLT 从 RSS http://www.blogjava.net/Unmi/rss 取出前面若干条记录,那么这个记录数就应该作声明为参数。

http://www.blogjava.net/Unmi/rss 的文档结构如下:

<rss>
    <channel>
        <item>
        <title>写第一个 WordPress 插件程序</title>
        <link>http://www.blogjava.net/Unmi/archive/2010/04/27/319398.html</link>
        <dc:creator>隔叶黄莺</dc:creator>
        <author>隔叶黄莺</author>
        <pubDate>Mon, 26 Apr 2010 17:06:00 GMT</pubDate>
         ..............................................
        </item>
        <item>
         .................................................

基于上面的需求,假定要前 5 条记录,XSLT 可以写成如下(c:\\Unmi_Rss_List.xslt): 阅读全文 >>

XSLT 文件中使用 C#/JScript/VB 自定义函数

在用 XSLT 转换 XML 到其他格式时,不光是原数据搬到别处,还可能需要对数据进行一定的处理,比如一个标志位要 XSLT 转换为表义字符串(1->True; 0->False),或者日期类型格式的转换等等。所以这时候我们在 XSLT 中要用到函数来处理这些细节上的转换。

XSLT 含有超过 100 个内建的函数,XQuery 1.0、XPath 2.0 以及 XSLT 2.0 共享相同的函数库。
这些函数用于字符串值、数值、日期和时间比较、节点和 QName 操作、序列操作、逻辑值,等等。

关于 XSLT 的内置函数请参数:XSLT 函数参考手册 和 XPath、XQuery 以及 XSLT 函数阅读全文 >>