基于 XSD 变化的动态 XSLT 生成

Posted

技术标签:

【中文标题】基于 XSD 变化的动态 XSLT 生成【英文标题】:Dynamic XSLT generation based on changes in XSD 【发布时间】:2018-01-07 23:37:00 【问题描述】:

最初我为每个 XSD 定义了不同的 XSD 我存储了一组 XML 文件。

一段时间后,XSD 定义发生了一些变化,因此我存储的 XML 不再是新的验证 XSD

为了获得支持,我需要编写 XSLT 并更改我存储的 XML 以再次验证新的 XSD

现在,在这种情况下,每次 XSD 变化时,我都需要手动编写 XSLT 如何动态生成这个 XSLT。 p>

目前我可以比较新旧 XSD 并使用 Microsoft.XmlDiffPatch DLL 获取变化列表。

基于这些更改,我需要使用 C# 生成 XSLT

【问题讨论】:

得到 Diff 后,使用Patch Tool。 这在这种情况下无济于事。因为 Patch 工具比较两个 XML 并在这两个中进行更改。但在我的情况下,我需要比较两个 XSD 以及根据更改需要在各自的 XML 中执行的结构更改。为此,我需要编写 XSLT。 【参考方案1】:

我不知道你的问题是什么,但我认为这在技术上是可行的。

编写一些读取 Xml 然后对其进行扩充并将其设置回文件/数据库/数据存储的 c# 代码可能更容易。

【讨论】:

据我所知,XSLT 是最好的选择,而不是 C#。【参考方案2】:

不确定是否有灵丹妙药。听起来您正在做一些工作,我建议您在面对未来的变化时尽可能地重复使用。

您可能需要考虑使用 xproc(通过 Calabash 或其他一些引擎)来创建 XML 管道,您可以通过该管道检测 XSD 的更改并将其传递到 XSL(也许要遵守每个 XSD 一个 XSL,以保持您的理智),然后说 XSL 接受这些更改并为当前正在处理更改的 XSD 绑定的所有 XML 文件处理它们。将所有这些分解为管道内的子转换是可能的,并且可能使未来的事情更加可重用。

在 XSL 中,您可能正在考虑执行以下操作:

所有要进行的更改 对于每个 XML 匹配/添加/删除每个元素和/或属性以实现更改

以某种标准格式表示要进行的更改的一种方法是作为要执行的操作的传入列表和要执行的相关元素/属性(可能将其设置为键/值对)。每个操作可以是字符串(添加、删除、转换)或数字代码。然后您遍历操作列表和相关元素并触发匹配以适应。

这有点抽象,因为我不知道您需要进行的更改的范围或深度。我真的只是在这里大声思考。您可能只需要埋头苦干,做一些严肃的一次性工作,然后实施某种变更控制流程,以确保将来事情不会失控。

希望这会有所帮助。祝你好运!

【讨论】:

以上是关于基于 XSD 变化的动态 XSLT 生成的主要内容,如果未能解决你的问题,请参考以下文章

动态添加 XML 标记,并且不应该允许基于使用 XSLT 的 xml 中特定标记的计数重复

XSLT - 动态添加元素

自动生成XSLT - 通用/默认XSLT

使用 xslt 按升序对 xsd 格式的 XML 进行排序

如何使用 XSLT 显示 XSD 验证的 XML

XML、XSD 和 XSLT 学生的项目