【问题标题】:One single XSLT template to transform one XML into another which follows a slightly different XSD?一个 XSLT 模板将一个 XML 转换为另一个遵循稍微不同的 XSD 的 XSLT 模板?
【发布时间】:2015-06-05 21:39:57
【问题描述】:

我对 XSLT 的想法/知识不熟悉。我已经看到它很少用于将 XML 数据转换为 HTML 以在网页上可视化。

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

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

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

因此,使用嵌套循环等说明 XSD(简单和复杂)中存在的每种元素。让我们假设 XSD 有一个共同的结构(大约 85% 相同)。如果是这样,XSLT 模板中未考虑的 XML 文件中的元素会发生什么情况?他们被排除在外了吗?

或者是否有其他方法可以不使用 XSLT。我刚刚听到很多人谈论 XSLT 来处理这类任务,我现在很好奇。

【问题讨论】:

  • 这个问题与 SO 无关,因为“可能的答案太多,或者对于这种格式来说,好的答案太长了。”下面给出的两个答案非常清楚地举例说明。
  • 两个答案几乎不能说明太多,其中一个实际上说明好的答案在这里可能很短。
  • @kjhughes 它说“太多可能答案”。您的答案 一个好答案(我实际上投了赞成票) - 但还有许多其他可能的答案。甚至是 Dijkgraaf 的作品。
  • @michael.hor257k:好吧,它可能有点宽泛,而且它令人惊讶地引发了基于意见的回应,所以我承认这一点(并认为这是我最罕见的赞成票之一珍惜;-) )。
  • @kjhughes 奉承会带你到任何地方......

标签: xml xslt xslt-2.0


【解决方案1】:

如果管理输入和输出 XML 文档的 XSD 基本相似,通常的做法是使用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>

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

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

只需添加到恒等转换中,1:1 映射将专门针对abc 元素进行不同映射。


更新以解决 cmets 中的问题

对于以下输入 XML,

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

是的,这个模板

  <xsl:template match="parent"/>

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

Michael.hor257k 已经在 cmets 中为您回答了这个问题。注意他的回答部分,即空模板不包含递归xsl:apply 调用。 (理解为什么恒等转换模板递归调用xsl:apply 并注意到上面显示的parent 的空模板不会。)

【讨论】:

  • 谢谢。我有点想看看是否有办法像这样复制。为了遵守目标 XSD,我可能需要找到一种方法来排除不需要的元素。
  • @tony 您通过将不需要的节点与空模板匹配来排除它们。
  • 感谢@michael.hor257k。因此,通过显式定义要排除的节点的空模板......我假设这些节点是复杂类型,那么这也将排除任何子节点
  • @tony 任何不将模板应用到其子级的模板都会中断文档树的递归遍历。
  • 好的,所以你说我必须确保为孩子以及孩子的孩子定义空模板......等等。 :/ 例如,如果我有 并且我想排除 元素,我需要为 也是如此。或者这一切都嵌套在一个“父”的空模板中。
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多