gad*_*omn 7 xml sorting xslt merge
问题是使用XSL合并和排序多个XML文件并输出有效的HTML,可以使用Firefox> = 3.5查看,如果可能,IE> = 7.答案应该尽可能简单(性能不重要).
文件a.xml
<?xml version="1.0"?>
<root>
<tag>cc</tag>
<tag>aa</tag>
</root>
Run Code Online (Sandbox Code Playgroud)
文件b.xml
<?xml version="1.0"?>
<root>
<tag>xx</tag>
<tag>bb</tag>
</root>
Run Code Online (Sandbox Code Playgroud)
文件index.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="merge.xslt"?>
<list>
<entry>a.xml</entry>
<entry>b.xml</entry>
</list>
Run Code Online (Sandbox Code Playgroud)
文件merge.xslt
<?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="list">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="entry">
<xsl:for-each select="document(.)/root/tag">
<!-- This will only sort the values of a single file -->
<xsl:sort select="." data-type="text" order="ascending" />
- <xsl:value-of select="."/> <br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
当前输出:
AA
CC
BB
XX
预期产量:
AA
BB
CC
XX
解决方案是一个非常简短的转换(绝对不需要扩展功能!):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<html>
<ul>
<xsl:apply-templates
select="document(entry)/*/tag">
<xsl:sort/>
</xsl:apply-templates>
</ul>
</html>
</xsl:template>
<xsl:template match="tag">
<li><xsl:value-of select="."/></li>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
在提供的index.xml文件上应用此转换时:
<list>
<entry>a.xml</entry>
<entry>b.xml</entry>
</list>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
<html>
<ul>
<li>aa</li>
<li>bb</li>
<li>cc</li>
<li>xx</li>
</ul>
</html>
Run Code Online (Sandbox Code Playgroud)
它在任何浏览器中显示为:
说明:此解决方案使用标准XSLT函数的强大功能document().如W3C XSLT 1.0建议书中所定义:
当文档函数只有一个参数且参数是一个节点集时,结果是对于参数node-set中的每个节点,对于调用文档函数的结果,第一个参数是字符串 - 节点的值
这解释了我们的代码中这个片段的效果:
<xsl:apply-templates
select="document(entry)/*/tag">
<xsl:sort/>
</xsl:apply-templates>
Run Code Online (Sandbox Code Playgroud)
这里发生的是document()函数的参数是entry顶部元素的所有子元素的节点集index.xml.结果是所有文档节点的并集.
因此:
select="document(entry)/*/tag"
Run Code Online (Sandbox Code Playgroud)
选择所tag引用的所有文档中的所有元素index.xml.然后对它们进行排序(by xsl:sort),并且已经排序的节点列表的每个元素由模板匹配处理tag.
| 归档时间: |
|
| 查看次数: |
7242 次 |
| 最近记录: |