You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于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样式,让表格看起来更整洁,你可以根据需要修改样式细节。

第三步:使用方法

  1. 把这个XSLT文件保存为merge-catalogs.xsl。
  2. 确保你的三个XML文件和XSLT文件在同一目录下,或者修改document()里的路径为正确的文件位置。
  3. 使用支持XSLT 1.0的工具(比如Saxon、XMLSpy,或者浏览器直接打开主XML文件并关联这个XSLT)来执行转换,就能得到排序好的HTML表格。

内容的提问来源于stack exchange,提问作者Sarah S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:53