我对XSLT的想法/知识不熟悉。我已经看到它最低限度地将XML数据转换为HTML以在网页上可视化。
我需要一些帮助才能理解如何在特定场景中使用XSLT的方法。例如,我有两个非常相似的独立XSD和两个单独的XML文件,一个验证一个XSD,另一个验证另一个。
因此,如果我提供其中一个XML文件,我需要对其进行转换,以便对不同的XSD进行验证,对此最好的实用方法是什么?
我不是在寻找代码,而是试图了解XSLT是如何用于这些情况的。是的,我已经发布了其他问题的例子。通常我会看到使用一些模板将XML文件转换为可能遵循不同XSD的所需格式。所以我想我的问题是,是否创建了一个遵循目标XSD文件整个结构的单个大型XSLT模板?
因此,使用嵌套循环来计算XSD中存在的各种元素(简单和复杂)等等。让我们假设XSD具有共同的结构(大约85%相同)。如果是这样,XML文件中的元素在XSLT模板中没有考虑到会发生什么?他们被排除在外吗?
或者是否有替代方法可能不使用XSLT。我刚刚听到很多人谈论XSLT这些任务,我现在很好奇。
答案 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文件。