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

XML合并需求:将XML B元素名作为XML A元素的dc属性

解决方案

假设你的XML A和XML B结构、节点顺序完全一致,以下是可以实现需求的XSLT样式表,核心是通过节点位置匹配两个文档的对应元素,并提取XML B的元素名作为dc属性值。

示例输入

XML A(本地自定义字段)

<record>
  <本地标题>测试文档</本地标题>
  <本地创作者>张三</本地创作者>
  <本地日期>2024-05-20</本地日期>
</record>

XML B(Dublin Core映射)

<record xmlns:dc="http://purl.org/dc/elements/1.1/">
  <dc:title>测试文档</dc:title>
  <dc:creator>张三</dc:creator>
  <dc:date>2024-05-20</dc:date>
</record>

XSLT样式表

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 加载XML B文档,注意路径需与XML A同级或正确指定 -->
  <xsl:variable name="xmlB" select="document('xmlB.xml')"/>

  <!-- 复制根节点,不添加dc属性 -->
  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <!-- 匹配XML A的子元素,添加dc属性并保留原结构 -->
  <xsl:template match="*[parent::/*]">
    <!-- 获取当前元素在父节点中的位置 -->
    <xsl:variable name="current-pos" select="position()"/>
    <!-- 从XML B中匹配同位置的元素,提取其完整名称(含前缀) -->
    <xsl:variable name="dc-element-name" select="$xmlB/*/*[$current-pos]/name()"/>

    <!-- 创建原名称的元素,添加dc属性 -->
    <xsl:element name="{name()}">
      <xsl:attribute name="dc" select="$dc-element-name"/>
      <!-- 复制元素内的文本内容 -->
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

  <!-- 复制文本节点 -->
  <xsl:template match="text()">
    <xsl:copy/>
  </xsl:template>
</xsl:stylesheet>

关键语法说明

  1. 加载XML B:使用document('xmlB.xml')加载外部文档,确保文件路径正确。
  2. 位置匹配:通过position()获取当前元素在父节点中的索引,在XML B的对应父节点下找到同索引的元素,这是最可靠的匹配方式(因为你明确说明节点顺序完全一致)。
  3. 提取元素名:用name()获取XML B元素的完整名称(如dc:title),如果只需要本地名称(如title),替换为local-name()即可。
  4. 保留原结构:通过xsl:element name="{name()}"保留XML A的原元素名,同时添加dc属性。

输出结果

<record>
  <本地标题 dc="dc:title">测试文档</本地标题>
  <本地创作者 dc="dc:creator">张三</本地创作者>
  <本地日期 dc="dc:date">2024-05-20</本地日期>
</record>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:25:17