我有一个项目,我需要将XML文件转换为CSV文件,反之亦然。我不能使用单个XSL文件,因为有不同的XML和CSV格式。因此,我只是想知道是否有任何方法(任何工具或编辑器或任何API)来基于XSD文件创建XSL文件。
我也愿意接受任何其他建议(我相信我不能避免XSL,因为将来可能会要求我将其转换为pdf,html等不同格式)
XSD 文件描述了符合某些规则的有效 XML 文件的结构。XSLT 文件描述如何将输入 XML 文档转换为某种输出形式,该形式可能是也可能不是 XML。不可能从 XSD 文件推导出 XSL 转换,因为它们解决 XML 的完全不同方面。
换句话说,XSD 允许您确认 XML 文档遵守一组预定义的约束,但没有说明如何处理 XML,或者如何将其转换为其他内容。
我意识到这个问题在三年前就被问过并得到了回答,但我在问自己同样的问题时遇到了它。简短的回答是肯定的,当然,因为您只是将一种类型的 XML 转换为另一种类型(尽管进行了一些结构和语法更改)。我看到了这个: https: //www.oxygenxml.com/archives/xsl-list/200807/msg00601.html - 它概述了作为概念证明的基本实现,我用它作为创建以下 XSLT 的起点:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" />
<xsl:template match="/">
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:element name="xsl:stylesheet">
<xsl:namespace name="xsl" select="'http://www.w3.org/1999/XSL/Transform'" /> <xsl:attribute name="version" select="'1.0'" />
<xsl:element name="xsl:output">
<xsl:attribute name="indent" select="'yes'" />
<xsl:attribute name="method" select="'xml'" />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:comment> </xsl:comment>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'/'" />
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'node()'" />
</xsl:element>
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'node()'" />
<xsl:element name="xsl:if">
<xsl:attribute name="test" select="'.!='''" />
<xsl:element name="xsl:copy"></xsl:element>
</xsl:element>
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:comment> </xsl:comment>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:apply-templates />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
</xsl:template>
<xsl:template match="xs:complexType[@name]">
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="@name" />
<xsl:apply-templates />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
</xsl:template>
<xsl:template match="xs:complexType[not(@*)]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!-- xsl:template match="xs:simpleType[@name]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
<xsl:apply-templates />
</xsl:element>
</xsl:template -->
<xsl:template match="xs:sequence">
<xsl:element name="xsl:copy">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="xs:element[@name]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
</xsl:element>
</xsl:template>
<xsl:template match="xs:attribute">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="concat( '@', @name )" />
</xsl:element>
</xsl:template>
<!-- xsl:template match="xs:element[@name]">
<xsl:text>

</xsl:text>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="@name" />
<xsl:text>
</xsl:text>
<xsl:comment>
auto generated stub for element <xsl:value-of select="@name" />
</xsl:comment>
<xsl:text>
</xsl:text>
</xsl:element>
<xsl:apply-templates />
</xsl:template -->
<xsl:template match="text()" />
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
请注意使用xsl:element来创建 XSLT 标记并创建属性、选择中的引用和转义select。match这些comment块的作用是在视觉上分解文档的根(使其更具可读性),但没有其他目的。此外,这还需要 XSLT 2.0 处理器。xsltproc用户无需申请。
根据之前的回复,您必须根据您的用例对其进行不同程度的修改。我这样做是为了能够快速创建一个准确的框架,从中构建出有用的 XSLT 文档,同时自动完成繁琐的基础工作。
当然,我刚刚花了几个小时开发和测试一些东西,此时我可能可以使用 grep 手动完成更快的工作,但至少它很有趣。希望这对某人有帮助,并欢迎改进。
| 归档时间: |
|
| 查看次数: |
10497 次 |
| 最近记录: |