0

0

如何在两个不同的XML Schema之间进行映射?

畫卷琴夢

畫卷琴夢

发布时间:2026-01-14 09:14:43

|

884人浏览过

|

来源于php中文网

原创

xml schema映射需显式定义,xsd自身不支持跨schema映射;常用方案是xslt 2.0+处理实例转换,命名空间、日期格式、枚举值等须在xslt中硬编码或查表,注释和appinfo不可靠,自动生成易出错。

如何在两个不同的xml schema之间进行映射?

XML Schema 映射不是自动发生的,必须显式定义规则

XML Schema(XSD)本身不提供跨 schema 的映射能力。xsd:importxsd:include 只解决命名空间合并和类型复用,不等同于字段级语义映射。如果你有两个独立的 XSD(比如 order-v1.xsdorder-edi850.xsd),它们的元素名、结构、数据类型甚至业务含义都可能不同,此时必须靠外部机制建立对应关系。

常用映射方式:XSLT 是最直接、可验证的方案

XSLT 2.0+ 支持强类型转换和模式匹配,适合处理 XSD 驱动的 XML 实例之间的转换。关键点在于:映射逻辑作用于 XML 实例(即符合某 XSD 的文档),而非 XSD 文件本身;XSD 仅用于校验输入/输出是否合法。

  • 先用 xmllint --schema order-v1.xsd input.xml 确保源 XML 合法
  • 编写 XSLT 时,用 <template match="v1:Order"></template> 匹配源结构,用 <transactionset></transactionset> 输出目标结构
  • 注意命名空间声明必须与目标 XSD 一致,例如 xmlns:edi="http://example.com/edi850"
  • 日期格式、枚举值映射(如 v1:Status = "shipped"edi:Status = "S")需在 XSLT 中硬编码或查表
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:v1="http://example.com/order-v1"
  xmlns:edi="http://example.com/edi850">
  <xsl:template match="v1:Order">
    <edi:TransactionSet>
      <edi:OrderNumber><xsl:value-of select="v1:OrderId"/></edi:OrderNumber>
      <edi:ShipDate><xsl:value-of select="format-date(v1:ShipDate, '[Y0001]-[M01]-[D01]')"/></edi:ShipDate>
    </edi:TransactionSet>
  </xsl:template>
</xsl:stylesheet>

避免把 XSD 注释或 appinfo 当作映射依据

有人尝试在 XSD 中用 <appinfo></appinfo><annotation></annotation> 添加类似 targetPath="/edi:Order/edi:ID" 的元信息,但这只是注释,没有任何工具会自动读取并执行它。主流验证器(xerces, libxml2)、编辑器(Oxygen)、甚至 JAXB 都忽略这类标记。

MakeSong
MakeSong

AI音乐生成,生成高质量音乐,仅需30秒的时间

下载
  • JAXB 的 @XmlRootElement(name="Order") 只控制 Java→XML 序列化,不解决跨 XSD 映射
  • OpenAPI-to-XSD 工具生成的 schema 缺乏语义关联,不能反向推导映射规则
  • 如果两个 XSD 共享相同 targetNamespace,但实际用途不同(如测试 vs 生产),仍需独立 XSLT

复杂映射场景下,手写 XSLT 比试图“自动生成”更可靠

所谓“XSD to XSD mapping 工具”(如 Altova MapForce 的 schema mode)最终仍导出 XSLT 或类似脚本。但自动生成常在以下地方出错:

  • 嵌套重复结构(如 v1:Itemedi:Loop230)无法正确识别层级边界
  • 条件逻辑缺失(如仅当 v1:Priority = "high" 才生成 edi:ExpediteFlag
  • 数据类型隐式转换失败(XSD 中 xs:decimal 对应的字符串含空格,XSLT 中未用 normalize-space() 清洗)

真正省时间的做法是:用 xmlstar 快速验证 XPath 表达式,再把调试好的路径填进 XSLT;对每个关键字段做 round-trip 测试——从 v1 XML → XSLT → EDI XML → 用 edi850.xsd 验证。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1942

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2117

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1156

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.7万人学习

Java 教程
Java 教程

共578课时 | 77.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号