Re: [xsl] XSLT 2.0 Quine

Subject: Re: [xsl] XSLT 2.0 Quine
From: Chris Maloney <voldrani@xxxxxxxxx>
Date: Thu, 11 Aug 2011 22:47:46 -0400
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@xxxxxxxxx> wrote:
> Dear all,
>
> While working on the first XProc Quine[1] , I discover that there was
> only two attempts to a quine inB 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">
> B <!-- (c) Innovimax 2011 - XSLT 2.0 Quine without DOE -->
> B <xsl:variable name="code">
> B  B <xsl:element name="xsl:stylesheet">
> B  B  B <xsl:attribute name="version" select="'2.0'"/>
> B  B  B <xsl:comment> (c) Innovimax 2011 - XSLT 2.0 Quine without DOE
> </xsl:comment>
> B  B  B <xsl:element name="xsl:variable">
> B  B  B  B <xsl:attribute name="name" select="'code'"/>
> B  B  B  B <xsl:element name="foo"/>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'/'"/>
> B  B  B  B <xsl:element name="xsl:apply-templates">
> B  B  B  B  B <xsl:attribute name="select" select="'$code'"/>
> B  B  B  B  B <xsl:attribute name="mode" select="'copy'"/>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'@*|node()'"/>
> B  B  B  B <xsl:attribute name="mode" select="'copy'"/>
> B  B  B  B <xsl:element name="xsl:copy">
> B  B  B  B  B <xsl:element name="xsl:apply-templates">
> B  B  B  B  B  B <xsl:attribute name="select" select="'@*|node()'"/>
> B  B  B  B  B  B <xsl:attribute name="mode" select="'copy'"/>
> B  B  B  B  B </xsl:element>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'foo'"/>
> B  B  B  B <xsl:attribute name="mode" select="'copy'"/>
> B  B  B  B <xsl:element name="xsl:apply-templates">
> B  B  B  B  B <xsl:attribute name="select" select="'$code'"/>
> B  B  B  B  B <xsl:attribute name="mode" select="'el'"/>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'*'"/>
> B  B  B  B <xsl:attribute name="mode" select="'el'"/>
> B  B  B  B <xsl:element name="xsl:element">
> B  B  B  B  B <xsl:attribute name="name" select="'xsl:element'"/>
> B  B  B  B  B <xsl:element name="xsl:attribute">
> B  B  B  B  B  B <xsl:attribute name="name" select="'name'"/>
> B  B  B  B  B  B <xsl:attribute name="select" select="'name()'"/>
> B  B  B  B  B </xsl:element>
> B  B  B  B  B <xsl:element name="xsl:apply-templates">
> B  B  B  B  B  B <xsl:attribute name="select"
select="'@*|*|text()|comment()'"/>
> B  B  B  B  B  B <xsl:attribute name="mode" select="'el'"/>
> B  B  B  B  B </xsl:element>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'@*'"/>
> B  B  B  B <xsl:attribute name="mode" select="'el'"/>
> B  B  B  B <xsl:element name="xsl:element">
> B  B  B  B  B <xsl:attribute name="name" select="'xsl:attribute'"/>
> B  B  B  B  B <xsl:element name="xsl:attribute">
> B  B  B  B  B  B <xsl:attribute name="name" select="'name'"/>
> B  B  B  B  B  B <xsl:attribute name="select" select="'name()'"/>
> B  B  B  B  B </xsl:element>
> B  B  B  B  B <xsl:element name="xsl:attribute">
> B  B  B  B  B  B <xsl:attribute name="name" select="'select'"/>
> B  B  B  B  B  B <xsl:text>'</xsl:text>
> B  B  B  B  B  B <xsl:element name="xsl:value-of">
> B  B  B  B  B  B  B <xsl:attribute name="select" select="'.'"/>
> B  B  B  B  B  B </xsl:element>
> B  B  B  B  B  B <xsl:text>'</xsl:text>
> B  B  B  B  B </xsl:element>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'text()'"/>
> B  B  B  B <xsl:attribute name="mode" select="'el'"/>
> B  B  B  B <xsl:element name="xsl:element">
> B  B  B  B  B <xsl:attribute name="name" select="'xsl:text'"/>
> B  B  B  B  B <xsl:element name="xsl:value-of">
> B  B  B  B  B  B <xsl:attribute name="select" select="'.'"/>
> B  B  B  B  B </xsl:element>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B  B <xsl:element name="xsl:template">
> B  B  B  B <xsl:attribute name="match" select="'comment()'"/>
> B  B  B  B <xsl:attribute name="mode" select="'el'"/>
> B  B  B  B <xsl:element name="xsl:element">
> B  B  B  B  B <xsl:attribute name="name" select="'xsl:comment'"/>
> B  B  B  B  B <xsl:element name="xsl:value-of">
> B  B  B  B  B  B <xsl:attribute name="select" select="'.'"/>
> B  B  B  B  B </xsl:element>
> B  B  B  B </xsl:element>
> B  B  B </xsl:element>
> B  B </xsl:element>
> B </xsl:variable>
> B <xsl:template match="/">
> B  B <xsl:apply-templates select="$code" mode="copy"/>
> B </xsl:template>
> B <xsl:template match="@*|node()" mode="copy">
> B  B <xsl:copy>
> B  B  B <xsl:apply-templates select="@*|node()" mode="copy"/>
> B  B </xsl:copy>
> B </xsl:template>
> B <xsl:template match="foo" mode="copy">
> B  B <xsl:apply-templates select="$code" mode="el"/>
> B </xsl:template>
> B <xsl:template match="*" mode="el">
> B  B <xsl:element name="xsl:element">
> B  B  B <xsl:attribute name="name" select="name()"/>
> B  B  B <xsl:apply-templates select="@*|*|text()|comment()" mode="el"/>
> B  B </xsl:element>
> B </xsl:template>
> B <xsl:template match="@*" mode="el">
> B  B <xsl:element name="xsl:attribute">
> B  B  B <xsl:attribute name="name" select="name()"/>
> B  B  B <xsl:attribute name="select">'<xsl:value-of
select="."/>'</xsl:attribute>
> B  B </xsl:element>
> B </xsl:template>
> B <xsl:template match="text()" mode="el">
> B  B <xsl:element name="xsl:text">
> B  B  B <xsl:value-of select="."/>
> B  B </xsl:element>
> B </xsl:template>
> B <xsl:template match="comment()" mode="el">
> B  B <xsl:element name="xsl:comment">
> B  B  B <xsl:value-of select="."/>
> B  B </xsl:element>
> B </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

Current Thread