xslt合并单元格
XSLT提供了灵活性和强大功能的完美结合。 XSLT不仅对发布网站有用,而且对转换或处理XML文档也很有用。 既然XSLT处理器随Java平台一起提供了(通过javax.xml.transform
)包,您就不能忽略它。
XSLT程序员经常提出的问题是,您应该如何处理多个文档? Java API仅需要两个参数:源(输入XML文档)和结果(保存输出的位置)。 尽管此API适用于许多应用程序,但在某些情况下,您需要组合多个源。 一些示例包括:
- 邮件合并 ,例如直接邮件营销活动,其中样式表将客户文件中的名称和地址与信函模板合并。
- 转换代码列表,例如产品参考。 国家/地区代码通常要求将目录文件与存储在单独文件中的代码列表进行匹配。
- 合并各个文档以进行发布。 例如,当出版一本书时,您可能希望合并章节文件,或者-如您在下一节中看到的-照片文件。
一个例子
以下示例说明了如何使用XML和XSLT合并多个文档以进行发布。 每张照片都有两个文件:照片本身(JPEG格式)和带有标题,日期和位置的XML描述。 描述文件可能类似于清单1。
清单1. geneva.xml -照片的XML描述
<?xml version="1.0"?>
<ph:photo xmlns:ph="http://ananas.org/2003/tips/photo">
<ph:title>The Jet d'Eau fountain</ph:title>
<ph:location>Geneva</ph:location>
<ph:date>April 2003</ph:date>
<ph:description>
The Jet d'Eau fountain is the most recognizable symbol of Geneva.
The fountain reaches 140 meters (460 feet) high, roughly the same height
as the Embassy Suites hotel in Times Square.
</ph:description>
</ph:photo>
清单1中的标记很简单。 编写用HTML发布样式表的时间不会太长。 一个更有趣的问题是如何创建一个将清单1与其他照片描述(例如清单2)相结合的画廊? (你会发现在可下载的代码,你会发现在更说明相关主题 。)
清单2. london.xml -照片的另一个XML描述
<?xml version="1.0"?>
<ph:photo xmlns:ph="http://ananas.org/2003/tips/photo">
<ph:title>Double-decker bus</ph:title>
<ph:location>London</ph:location>
<ph:date>October 2002</ph:date>
<ph:description>
An inescapable symbol of London, the double-decker bus is much taller
than typical buses to carry many passengers through the city's overcrowded
streets.
</ph:description>
</ph:photo>
在继续之前,我想向您展示一些定义。 通过Java API传递给样式表的XML文档称为主要来源 。 样式表加载的其他文档称为辅助源 。
document()函数
由于Java API仅接受一个来源,因此您必须从样式表本身加载次要来源。 这是通过document()
函数完成的,该函数将URI作为参数。 该函数解析文档并返回节点集。
为了完整起见, document()
还接受一个节点集作为参数,在这种情况下,该函数假定每个节点都是一个URI。 最后,您可以传递字符串和节点集的组合作为参数。 该功能将两者结合起来,以确定要加载的文档。 不过,在大多数情况下,传递单个URI更简单。
例如,以下XPath加载清单1中所示的geneva.xml
文档:
document('geneva.xml')
由于document()
返回一个节点集,因此您几乎可以在XPath有效的任何位置插入它。 更具体地说,您可以将选择器添加到路径。 例如,以下XPath加载geneva.xml
文档并返回其标题:
document('geneva.xml')/ph:photo/ph:title
具有document()
函数的XPath可以出现在XPath合法的任何地方,例如xsl:value-of
和xsl:apply-templates
指令的select
属性。 因此,要显示文档标题,您可以编写以下指令:
<xsl:value-of select="document('geneva.xml')/ph:photo/ph:title"/>
为辅助源编写XPath时要小心。 忘记根很容易,但是如果这样做,XPath将返回一个空节点集。 例如,如果我忘记了XPath中的ph:photo
(辅助文档的根目录),则会得到以下XPath,该XPath返回空的节点集:
document('geneva.xml')/ph:title
合并文件
总而言之,将文档与XSLT结合使用时,您要从主要来源开始并加载次要来源。 最简单的解决方案之一是在主要解决方案中列出次要资源。 主要资源类似于清单3 -仅列出要合并的文档(以及为集合提供标题)。
清单3. index.xml列出了辅助源
<?xml version="1.0"?>
<ph:index xmlns:ph="http://ananas.org/2003/tips/photo">
<ph:title>City sights</ph:title>
<ph:entry>geneva</ph:entry>
<ph:entry>london</ph:entry>
<ph:entry>paris</ph:entry>
<ph:entry>roma</ph:entry>
</ph:index>
清单4是样式表本身。 它为主要来源和次要来源中的元素定义模板。 两者之间的链接位于ph:index
模板中,该模板可解析辅助资源。 xsl:apply-templates
指令意味着处理器将遍历辅助源并随其应用模板。 在实践中,它的行为就像辅助资源包含在主要资源中。
清单4. merge.xsl -样式表处理主要来源中列出的文档
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ph="http://ananas.org/2003/tips/photo">
<xsl:output method="html"/>
<xsl:template match="ph:index">
<html>
<head><title><xsl:value-of select="ph:title"/></title></head>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="ph:index/ph:title">
<h1><xsl:apply-templates/></h1>
</xsl:template>
<xsl:template match="ph:entry">
<img src="{concat(.,'.jpg')}" align="right"/>
<xsl:apply-templates select="document(concat(.,'.xml'))"/>
<br clear="right"/>
</xsl:template>
<xsl:template match="ph:photo/ph:title">
<h2><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="ph:location">
<h3>in <xsl:apply-templates/></h3>
</xsl:template>
<xsl:template match="ph:date">
<p>Date: <xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="ph:description">
<p><xsl:apply-templates/></p>
</xsl:template>
</xsl:stylesheet>
将清单4应用于清单3的结果是一个包含所有照片HTML文档。 这种方法的好处之一是,您可以通过编辑index.xml
文档将照片添加到图库中或从中删除照片。 此外,在不同画廊之间共享照片也很容易。 假设您想要第二个画廊,里面有更多日内瓦的照片。 您只需要创建另一个清单,类似于清单3 ,就指向这些照片。 您可以在两个画廊中都包含清单1中的描述,但是不必重复它。
其他应用
本技巧文章中描述的技术具有许多应用。 您可以使用document()
函数创建跨越多个文件的索引或目录。 我还用它来检索链接标题:只需在URI后面加上document()
函数并恢复文档标题即可。 我还用它来查看每日日志并生成月度报告。
翻译自: https://www.ibm.com/developerworks/xml/library/x-tipcombxslt/index.html
xslt合并单元格