I realise that this was asked and answered a good 3 years ago, but I came across it while asking myself the same question. The short answer is yes, of course, because you are simply converting one type of XML to another (albeit with some structural and syntax changes). I saw this: https://www.oxygenxml.com/archives/xsl-list/200807/msg00601.html - which outlines a basic implementation as proof of concept, and I used that as a starting point to create the following 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>
Note the use of xsl:element
to create the XSLT tags and creating select
and match
attributes, the quoting in selects and escaping. The comment
blocks are there to visually break up the root of the document (make it more readable) but serve no other purpose. Also, this requires an XSLT 2.0 processor. xsltproc
users need not apply.
As per the previous responses, you'll have to modify it in varying degrees for your use case. I made this so that I could quickly create an accurate skeleton from which I could build out a useful XSLT document, while automating the tedious groundwork.
Naturally, I've just spent hours developing and testing something that at this point I probably could have done faster by hand with grep, but at least it was interesting. Hope this helps someone and improvements are welcome.