如何使用XSLT处理两个XML文件合并生成含指定属性的TEI结构XML
实现思路
- 以结构完整的第一个XML作为转换的主输入
- 将带属性的第二个XML作为辅助文件加载到XSLT中
- 按节点顺序一一匹配两个文件中的
<TEI>节点,将第二个文件中<TEI>的xmlns、xml:id属性复制到对应第一个文件的<TEI>节点上 - 第一个文件中所有
<TEI>下的子节点和内容完整保留,不做修改
完整XSLT示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0" exclude-result-prefixes="tei"> <!-- 配置第二个带属性的XML文件路径,转换时也可通过外部参数传入 --> <xsl:param name="attrSourcePath" select="'你的第二个文件路径.xml'"/> <!-- 加载第二个文件的内容 --> <xsl:variable name="attrSource" select="doc($attrSourcePath)"/> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 匹配第一个文件中的TEI节点,替换属性 --> <xsl:template match="TEI"> <!-- 获取当前TEI的位置索引(从1开始计数) --> <xsl:variable name="pos" select="position()"/> <!-- 匹配第二个文件中对应位置的TEI节点 --> <xsl:variable name="targetTei" select="$attrSource/root/tei:TEI[$pos]"/> <!-- 复制目标TEI的所有属性(包含xmlns和xml:id) --> <xsl:copy select="$targetTei"> <xsl:copy-of select="$targetTei/@*"/> <!-- 保留当前TEI下的所有子节点内容 --> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
使用说明
- 执行XSLT转换时,主输入文件选择结构完整的第一个XML
- 可直接修改代码中
attrSourcePath参数的值为第二个XML的本地路径,也可在转换时通过外部参数传入该路径 - 输出结果即为合并后的XML,所有
<TEI>节点都带有对应xmlns和xml:id属性,原有子节点完全保留
注意:该方案默认两个文件的<TEI>节点按顺序一一对应,即第一个文件的第N个<TEI>对应第二个文件的第N个<TEI>,如果匹配逻辑不同可自行调整模板中的匹配规则。
内容的提问来源于stack exchange,提问作者Becky B
相关产品推荐
相关产品推荐

