You are a crazy genius, and this is a thing of beauty!
I can verify that it works -- amazing!
Just a note, it works as a version 1.0 stylesheet too (as long as you
change "2.0" to "1.0" everywhere, of course ;-)
On Thu, Aug 11, 2011 at 1:21 PM, Xmlizer <xmlizer+xsllist(_at_)gmail(_dot_)com>
wrote:
Dear all,
While working on the first XProc Quine[1] , I discover that there was
only two attempts to a quine in XSLT 1.0 [2]
The existing two are based on
* the DOE trick
* the document('') trick
So I was a bit disappointed
That's why I crafted this one which is not using DOE nor document trick
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<!-- (c) Innovimax 2011 - XSLT 2.0 Quine without DOE -->
<xsl:variable name="code">
<xsl:element name="xsl:stylesheet">
<xsl:attribute name="version" select="'2.0'"/>
<xsl:comment> (c) Innovimax 2011 - XSLT 2.0 Quine without DOE
</xsl:comment>
<xsl:element name="xsl:variable">
<xsl:attribute name="name" select="'code'"/>
<xsl:element name="foo"/>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'/'"/>
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'$code'"/>
<xsl:attribute name="mode" select="'copy'"/>
</xsl:element>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'@*|node()'"/>
<xsl:attribute name="mode" select="'copy'"/>
<xsl:element name="xsl:copy">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'@*|node()'"/>
<xsl:attribute name="mode" select="'copy'"/>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'foo'"/>
<xsl:attribute name="mode" select="'copy'"/>
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'$code'"/>
<xsl:attribute name="mode" select="'el'"/>
</xsl:element>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'*'"/>
<xsl:attribute name="mode" select="'el'"/>
<xsl:element name="xsl:element">
<xsl:attribute name="name" select="'xsl:element'"/>
<xsl:element name="xsl:attribute">
<xsl:attribute name="name" select="'name'"/>
<xsl:attribute name="select" select="'name()'"/>
</xsl:element>
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'@*|*|text()|comment()'"/>
<xsl:attribute name="mode" select="'el'"/>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'@*'"/>
<xsl:attribute name="mode" select="'el'"/>
<xsl:element name="xsl:element">
<xsl:attribute name="name" select="'xsl:attribute'"/>
<xsl:element name="xsl:attribute">
<xsl:attribute name="name" select="'name'"/>
<xsl:attribute name="select" select="'name()'"/>
</xsl:element>
<xsl:element name="xsl:attribute">
<xsl:attribute name="name" select="'select'"/>
<xsl:text>'</xsl:text>
<xsl:element name="xsl:value-of">
<xsl:attribute name="select" select="'.'"/>
</xsl:element>
<xsl:text>'</xsl:text>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'text()'"/>
<xsl:attribute name="mode" select="'el'"/>
<xsl:element name="xsl:element">
<xsl:attribute name="name" select="'xsl:text'"/>
<xsl:element name="xsl:value-of">
<xsl:attribute name="select" select="'.'"/>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'comment()'"/>
<xsl:attribute name="mode" select="'el'"/>
<xsl:element name="xsl:element">
<xsl:attribute name="name" select="'xsl:comment'"/>
<xsl:element name="xsl:value-of">
<xsl:attribute name="select" select="'.'"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="$code" mode="copy"/>
</xsl:template>
<xsl:template match="@*|node()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="copy"/>
</xsl:copy>
</xsl:template>
<xsl:template match="foo" mode="copy">
<xsl:apply-templates select="$code" mode="el"/>
</xsl:template>
<xsl:template match="*" mode="el">
<xsl:element name="xsl:element">
<xsl:attribute name="name" select="name()"/>
<xsl:apply-templates select="@*|*|text()|comment()" mode="el"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*" mode="el">
<xsl:element name="xsl:attribute">
<xsl:attribute name="name" select="name()"/>
<xsl:attribute name="select">'<xsl:value-of select="."/>'</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="text()" mode="el">
<xsl:element name="xsl:text">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="comment()" mode="el">
<xsl:element name="xsl:comment">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Cheers,
Xmlizer
[1] http://blog.innovimax.fr/index.php/2011/08/11/38-xproc-quine
[2] http://www2.informatik.hu-berlin.de/~obecker/XSLT/#quine
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--