求助:基于XSLT合并展示3个XML文件并实现指定排序
多XML书目文件合并与排序的XSLT解决方案
我来帮你写一个完全符合需求的XSLT文件,同时会拆解关键逻辑,让你明白每一步的作用。这个XSLT会加载你所有的3个XML书目文件,提取指定字段,生成排序后的表格。
第一步:完整的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" encoding="UTF-8"/> <!-- 定义要加载的额外XML文件路径,替换成你实际的文件名 --> <xsl:variable name="catalog2" select="document('catalog2.xml')"/> <xsl:variable name="catalog3" select="document('catalog3.xml')"/> <!-- 收集所有三个文件中的catalogRecord节点 --> <xsl:variable name="allRecords" select="/catalog/catalogRecord | $catalog2/catalog/catalogRecord | $catalog3/catalog/catalogRecord"/> <xsl:template match="/"> <html> <head> <title>合并排序后的书目列表</title> <style> table { border-collapse: collapse; width: 80%; margin: 20px auto; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } </style> </head> <body> <h2>合并排序后的书目列表</h2> <table> <thead> <tr> <th>创作者</th> <th>标题</th> <th>资源格式</th> <th>出版日期</th> </tr> </thead> <tbody> <!-- 先按出版日期升序排序,日期相同则按创作者姓氏升序排序 --> <xsl:for-each select="$allRecords"> <xsl:sort select="originInfo/dateIssued" data-type="number" order="ascending"/> <xsl:sort select="nameInfo[1]/name" data-type="text" order="ascending"/> <tr> <!-- 提取所有创作者,按姓氏字母排序后拼接 --> <td> <xsl:for-each select="nameInfo"> <xsl:sort select="name" data-type="text" order="ascending"/> <xsl:if test="position() > 1">, </xsl:if> <xsl:value-of select="concat(forename, ' ', name)"/> <xsl:if test="role != ''"> (<xsl:value-of select="role"/>)</xsl:if> </xsl:for-each> </td> <td><xsl:value-of select="titleInfo/title"/></td> <td><xsl:value-of select="typeOfResource"/></td> <td><xsl:value-of select="originInfo/dateIssued"/></td> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> </xsl:stylesheet>
第二步:关键逻辑解释
- 加载多文件:用
document()函数加载另外两个XML文件,你只需要把catalog2.xml和catalog3.xml替换成你实际的文件名即可。 - 收集所有记录:用
|运算符把三个文件里的catalogRecord节点合并成一个统一的集合。 - 全局排序:外层的
<xsl:sort>先按dateIssued(出版日期)升序排序(从旧到新),如果日期相同,再按第一个创作者的姓氏升序排序。 - 创作者排序:每个记录里的多个创作者会按姓氏(
name字段)字母排序后展示,单创作者场景自然也符合排序逻辑。 - 表格样式:内置了简单的CSS样式,让表格看起来更整洁,你可以根据需要修改样式细节。
第三步:使用方法
- 把这个XSLT文件保存为
merge-catalogs.xsl。 - 确保你的三个XML文件和XSLT文件在同一目录下,或者修改
document()里的路径为正确的文件位置。 - 使用支持XSLT 1.0的工具(比如Saxon、XMLSpy,或者浏览器直接打开主XML文件并关联这个XSLT)来执行转换,就能得到排序好的HTML表格。
内容的提问来源于stack exchange,提问作者Sarah S.
相关产品推荐
相关产品推荐

