首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

几种操作 Feed 的 API 的示例及其比较 -4 XSLT 以及 XSLT API

几种操作 Feed 的 API 的示例及其比较 -4 XSLT 以及 XSLT API

XSLT 以及 XSLT APIXSLT 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。通过 XSLT,可以向或者从输出文件添加或移除元素和属性。也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。
在转换过程中,XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。下面来看下用 XSLT 技术来实现 Feed Query。
要使用 XSLT,首先需要创建 XSL,如清单 4 所示:
清单 4. 用于 Feed Query 的 XSL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:row="http://www.ibm.com/xmlns/atom/content/datarow/1.0">
<xsl:template match="atom:feed">
<xsl:copy>
<!-- copy all nodes outside of "entry" -->
<xsl:copy-of select="node()[not(self::atom:entry)]"/>
<!-- processing entries -->
<xsl:for-each select="//atom:entry">
<!-- filtering -->
<xsl:if test="atom:content/row:row/row:Customer_Name = 'Ford'">
<xsl:copy>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>




XSL 的语法在这里不多讲,不熟悉的读者请参见:
接下来看看用 JAVA JDK XSLT API 的实现,见清单 5:
清单 5. 用 XSLT API 实现 Feed Query
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package xml.xslt;

import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XSLTFilterFeed implements main.IFilterFeed{
  
public OutputStream filter(InputStream is, String xpathExpr){
OutputStream os = System.out;
try{  
//create input xml stream source
StreamSource transrormSource = new StreamSource(is);
  
  // create stylesheet stream source
InputStream xsl = XSLTFilterFeed.class.getResourceAsStream("filter.xsl");
Source styleSource = new StreamSource(xsl);
  
  //new transformer
Transformer transformer = TransformerFactory.newInstance().newTransformer(styleSource);
  
//create output stream result
StreamResult transformedResult = new StreamResult(os);

//perform transformation
transformer.transform(transrormSource, transformedResult);
  
} catch(Exception ex){
ex.printStackTrace();
}
  
return os;
}
  
}




代码很简单。用 XLST API 的实现的主要难度是在写 XSL。对程序员的技能的要求比较高,需要熟悉 XSLT 和相应版本的 XPath 的语法。另外 Transform 可以 streaming 的进行,对于那些资源受限而又想获得较好的性能的程序比较适合。
返回列表