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
相关产品推荐
相关产品推荐

