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>
关键语法说明
- 加载XML B:使用
document('xmlB.xml')加载外部文档,确保文件路径正确。 - 位置匹配:通过
position()获取当前元素在父节点中的索引,在XML B的对应父节点下找到同索引的元素,这是最可靠的匹配方式(因为你明确说明节点顺序完全一致)。 - 提取元素名:用
name()获取XML B元素的完整名称(如dc:title),如果只需要本地名称(如title),替换为local-name()即可。 - 保留原结构:通过
xsl:element name="{name()}"保留XML A的原元素名,同时添加dc属性。
输出结果
<record> <本地标题 dc="dc:title">测试文档</本地标题> <本地创作者 dc="dc:creator">张三</本地创作者> <本地日期 dc="dc:date">2024-05-20</本地日期> </record>
内容的提问来源于stack exchange,提问作者BRiesenberg
相关产品推荐
相关产品推荐

