有没有一种方法可以基于XSD文件动态创建XSL文件

kar*_*ece 5 xslt

我有一个项目,我需要将XML文件转换为CSV文件,反之亦然。我不能使用单个XSL文件,因为有不同的XML和CSV格式。因此,我只是想知道是否有任何方法(任何工具或编辑器或任何API)来基于XSD文件创建XSL文件。

我也愿意接受任何其他建议(我相信我不能避免XSL,因为将来可能会要求我将其转换为pdf,html等不同格式)

Jim*_*son 5

XSD 文件描述了符合某些规则的有效 XML 文件的结构。XSLT 文件描述如何将输入 XML 文档转换为某种输出形式,该形式可能是也可能不是 XML。不可能从 XSD 文件推导出 XSL 转换,因为它们解决 XML 的完全不同方面。

换句话说,XSD 允许您确认 XML 文档遵守一组预定义的约束,但没有说明如何处理 XML,或者如何将其转换为其他内容。


Kev*_*eur 5

我意识到这个问题在三年前就被问过并得到了回答,但我在问自己同样的问题时遇到了它。简短的回答是肯定的,当然,因为您只是将一种类型的 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="'.!=&apos;&apos;'" />
                    <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>&#xA;&#xA;</xsl:text>
        <xsl:element name="xsl:template">
            <xsl:attribute name="match" select="@name" /> 
            <xsl:text>&#xA;</xsl:text>
            <xsl:comment>
                auto generated stub for element <xsl:value-of select="@name" /> 
            </xsl:comment>
            <xsl:text>&#xA;</xsl:text>
        </xsl:element>
        <xsl:apply-templates /> 
    </xsl:template -->

    <xsl:template match="text()" />

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

请注意使用xsl:element来创建 XSLT 标记并创建属性、选择中的引用和转义selectmatch这些comment块的作用是在视觉上分解文档的根(使其更具可读性),但没有其他目的。此外,这还需要 XSLT 2.0 处理器。xsltproc用户无需申请。

根据之前的回复,您必须根据您的用例对其进行不同程度的修改。我这样做是为了能够快速创建一个准确的框架,从中构建出有用的 XSLT 文档,同时自动完成繁琐的基础工作。

当然,我刚刚花了几个小时开发和测试一些东西,此时我可能可以使用 grep 手动完成更快的工作,但至少它很有趣。希望这对某人有帮助,并欢迎改进。