一个XSLT模板将一个XML转换为另一个XML,它遵循略有不同的XSD?

时间:2015-06-05 21:39:58

标签: xml xslt xslt-2.0

我对XSLT的想法/知识不熟悉。我已经看到它最低限度地将XML数据转换为HTML以在网页上可视化。

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

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

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

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

或者是否有替代方法可能不使用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>

对于那些不应该相同的节点,会编写特殊模板来生成差异。如果<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空模板不会。)

答案 1 :(得分:-1)

  

最好的实用方法是什么?

如果它们是大型模式,而不是尝试手动创建XSLT,那么您将需要找到一个工具集,该工具集将允许您创建将为您生成XSLT的映射。其中包括Altova Mapforce等独立工具,以及Microsoft BizTalk和Mulesoft等服务器级平台,其中包括用于映射的开发工具。

  

是否会创建一个大型XSLT模板,该模板遵循目标XSD文件的整个结构?

是的,这些工具将创建一个XSLT,它将为目标XSD创建结构。

  XML文件中的

元素在XSLT模板中没有考虑到?他们被排除在外吗?

是的,除非您按照kjhughes所述复制整个节点,否则将排除未映射的字段。但是,如果您尝试将其转换为与特定XSD匹配的XML,则可能不希望这样做,因为该节点可能不匹配。

但是,这些可能是您没有源代码的可选元素,因此仍会为目标XSD创建有效的XML文件。