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

XSLT通过共享ID匹配双XML文件提取对应主题数据求助

问题根因

当前代码输出包含全部主题标目的核心错误是节点选择范围不对:

  • 你虽然通过ID匹配筛选出了对应的主题记录存入$shcheck变量,但实际复制内容时用的选择器是$subjectheading/subjects,这个路径会选中外部主题文件里所有record节点下的subjects,没有限定到当前ID匹配的单条记录,所以两条输出都会带出全部主题。
  • 代码中<xsl:for-each select=".">属于冗余逻辑,没有实际遍历作用,可以直接删除。
    另外把外部主题文件的加载放到全局变量即可,不需要每次匹配Section节点时重复加载,能提升转换效率。
修正后完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:str="http://exslt.org/strings"
    xmlns:functx="http://www.functx.com" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:oai="http://www.openarchives.org/OAI/2.0/">

    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    <xsl:strip-space elements="*"/>

    <!-- 全局加载外部主题文件,避免重复读取 -->
    <xsl:variable name="subject-records" select="document('mimsy_subject_data_export_tidied_for_SO.xml')/mimsy_subject_data/record"/>

    <xsl:template match="root">
        <marc:collection>
            <xsl:apply-templates/>
        </marc:collection>
    </xsl:template>

    <xsl:template match="Details">
        <xsl:apply-templates select="Section"/>
    </xsl:template>

    <xsl:template match="Section">
        <xsl:variable name="current-id" select="Field[@Name = 'IDNUMBER1']/Value" />
        <xsl:variable name="matched-subject" select="$subject-records[id_number=$current-id]" />

        <marc:record>
            <xsl:if test="$matched-subject">
                <marc:datafield tag="650" ind1=" " ind2=" ">
                    <marc:subfield code="a">
                        <!-- 只复制当前匹配到的记录下的subjects节点 -->
                        <xsl:copy-of select="$matched-subject/subjects"/>
                    </marc:subfield>
                </marc:datafield>
            </xsl:if>
        </marc:record>
    </xsl:template>

    <xsl:template match="*"/>
</xsl:stylesheet>
效果说明

运行上述修正后的代码,输出结果会和预期完全一致:两条MARC记录分别只绑定对应ID关联的主题标目,不会出现全量主题重复出现的问题。


内容的提问来源于stack exchange,提问作者IIAND

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:39:51