将一个 XML 转换为另一个 XSD 稍有不同的 XSLT 模板?

One single XSLT template to transform one XML into another which follows a slightly different XSD?

我是 idea/knowledge XSLT 的新手。我已经看到它最低限度地用于将 XML 数据转换为 HTML 以在网页上可视化。

我需要一些帮助来了解如何在特定场景中使用 XSLT。例如,我有两个非常相似的单独 XSD 和两个单独的 XML 文件,一个验证一个 XSD,另一个验证另一个

因此,如果我要提供 XML 文件之一,我需要对其进行转换,以便它验证不同的 XSD 最佳实用方法是什么?

我不是在寻找代码,而是在尝试查看 XSLT 如何用于这些情况。是的,我已经从发布的其他问题中看到了这方面的例子。通常我会看到使用了一些模板将 XML 文件转换为可能遵循不同 XSD 的所需格式。所以我想我的问题是,是否可以创建一个遵循目标 XSD 文件的整个结构的大型 XSLT 模板?

因此,考虑到 XSD(简单和复杂)中存在的各种元素以及嵌套循环等等。假设 XSD 具有共同的结构(大约 85% 相同)。如果是这样,XML 文件中未在 XSLT 模板中说明的元素会怎样?他们被排除在外了吗?

或者是否有其他方法可以不使用 XSLT 来执行此操作。我刚刚听说很多人都在谈论 XSLT 用于这类任务,我现在很好奇。

如果管理输入和输出文档的 XSD XML 基本相似,通常的做法是使用 identity transformation,默认情况下,它会准确地将节点从输入复制到输出。

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

对于那些不应该相同的节点,编写了特殊的模板来生成差异。如果 <abc/> 应该映射到 <xyz/>,那么

  <xsl:template match="abc">
    <xyz/>
  </xsl:template>

只需添加到身份转换,1:1 映射将专门针对 abc 个元素进行修改,以不同方式映射。


更新以解决评论中的问题

对于以下输入XML,

<parent>
  <child>
    <child_child></child_child>
  </child>
</parent>

是的,这个模板

  <xsl:template match="parent"/>

将阻止 parent 及其所有后代被身份转换模板复制到输出。

Michael.hor257k 已在评论中为您解答。注意他的回答中声明空模板不包含递归 xsl:apply 调用的部分。 (了解恒等转换模板递归调用 xsl:apply 的原因,并注意上面显示的 parent 等空模板不会调用。)