如何合并多个XML并为合并后的XML编写对应的XSLT样式表
合并多个XML及适配XSLT实现方案
1 合并后XML的标准结构
将多个XML的<catalog>节点统一放到自定义顶层根节点下即可完成合并,可给每个<catalog>添加source属性标识来源,方便后续XSLT处理,支持任意数量XML扩展:
<?xml version="1.0" encoding="UTF-8"?> <mergedCatalogs> <catalog source="XML-1"> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> </cd> </catalog> <catalog source="XML-2"> <cd> <title>Empire Burlesque-1</title> <artist>Bob Dylan-1</artist> </cd> </catalog> </mergedCatalogs>
2 适配合并后XML的XSLT代码
调整原XSLT的节点匹配路径,自动适配多XML列展示:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <!-- 表头自动生成所有XML来源列 --> <tr bgcolor="#9acd32"> <th style="text-align:left">Details</th> <xsl:for-each select="mergedCatalogs/catalog"> <th style="text-align:left"><xsl:value-of select="@source"/></th> </xsl:for-each> </tr> <!-- 标题行 --> <tr> <td>Title</td> <xsl:for-each select="mergedCatalogs/catalog/cd"> <td><xsl:value-of select="title"/></td> </xsl:for-each> </tr> <!-- 艺术家行 --> <tr> <td>Artist</td> <xsl:for-each select="mergedCatalogs/catalog/cd"> <td><xsl:value-of select="artist"/></td> </xsl:for-each> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet>
3 额外方案:无需提前合并XML的实现方式
如果不需要生成统一的合并XML文件,可直接在原单XML的XSLT中通过document()函数加载其他XML文件,适合XML文件独立存储的场景:
<!-- 示例:在XSLT中直接加载XML-2文件,路径替换为实际存储路径 --> <xsl:variable name="xml2" select="document('xml2.xml')/catalog/cd" /> <!-- 取值示例 --> <td><xsl:value-of select="$xml2/title"/></td> <td><xsl:value-of select="$xml2/artist"/></td>
内容的提问来源于stack exchange,提问作者ANUJI VARGHESE
相关产品推荐
相关产品推荐

