apply-gen initial development

master
Mike Gerwitz 2014-11-20 12:00:55 -05:00
parent d3aaa7faa0
commit c73f3a4e7c
2 changed files with 204 additions and 0 deletions

View File

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Generate boilerplate for dynamic function applications
Copyright (C) 2014 LoVullo Associates, Inc.
This file is part of hoxsl.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://www.lovullo.com/hoxsl/apply"
xmlns:fgen="http://www.lovullo.com/hoxsl/apply/gen"
xmlns:out="http://www.lovullo.com/hoxsl/apply/gen/_out"
exclude-result-prefixes="#default fgen">
<output indent="yes"
encoding="utf-8" />
<namespace-alias stylesheet-prefix="out"
result-prefix="xsl" />
<!--
Begin processing of XSLT document
A document will be output with a generated stylesheet containing the
boilerplate necessary for dynamically calling each of the functions
defined therein.
-->
<template match="/xsl:stylesheet|/xsl:transform"
priority="5">
<document>
<out:stylesheet>
<xsl:apply-templates mode="fgen:create" />
</out:stylesheet>
</document>
</template>
<!--
Refuse to process non-XSLT documents
Hopefully will help to avoid confusion when accidentally processing
the wrong file.
-->
<template match="/*"
priority="1">
<message terminate="yes">
<text>fatal: unexpected root node `</text>
<value-of select="name()" />
<text>'</text>
</message>
</template>
<!--
Process function definition
-->
<template mode="fgen:create"
match="xsl:function"
priority="5">
<!-- we need to take care with namespacing; let's remove context
dependencies and simply specify the full namespace URI -->
<variable name="name-resolv"
select="resolve-QName( @name, . )" />
<variable name="local-name"
select="substring-after( @name, ':' )" />
<variable name="ns-prefix"
select="substring-before( @name, ':' )" />
<variable name="ns"
select="namespace-uri-for-prefix(
$ns-prefix, . )" />
<sequence select="fgen:create-func(
$name-resolv, $local-name, $ns )" />
</template>
<!--
Drop irrelevant nodes
We do not retain any of the original nodes in the document, as the
result document is intended to be imported into the original.
-->
<template mode="fgen:create"
match="*|text()"
priority="1">
<!-- must not be very important! -->
</template>
<function name="fgen:create-func">
<param name="name-resolv" as="xs:QName" />
<param name="local-name" as="xs:string" />
<param name="ns" as="xs:anyURI" />
<out:function name="{$name-resolv}" as="element()">
<element name="{$local-name}"
namespace="{$ns}" />
</out:function>
</function>
</stylesheet>

View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Tests dynamic function application boilerplate generation
Copyright (C) 2014 LoVullo Associates, Inc.
This file is part of hoxsl.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<description xmlns="http://www.jenitennison.com/xslt/xspec"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="http://www.lovullo.com/_junk"
stylesheet="../../src/transform/apply-gen.xsl">
<!-- basic case -->
<scenario label="given a unary function">
<context>
<xsl:stylesheet>
<xsl:function name="foo:bar">
<xsl:param name="foo" />
</xsl:function>
</xsl:stylesheet>
</context>
<expect label="generates a function of the same name"
test="xsl:stylesheet/xsl:function/@name = 'foo:bar'" />
<expect label="generates function of type `element()'"
test="xsl:stylesheet/xsl:function/@as = 'element()'" />
<!-- this function is used to generate an element for later
application -->
<expect label="generated function is nullary"
test="count( xsl:stylesheet/xsl:function/xsl:param ) = 0" />
<!-- the generated node is simply the same name and namespace as
the function -->
<expect label="generated function produces function node"
context="xsl:stylesheet/xsl:function/*">
<foo:bar />
</expect>
</scenario>
<scenario label="given a stylesheet">
<scenario label="with no function elements">
<context>
<xsl:stylesheet>
<xsl:template name="foo" />
<xsl:template name="bar" />
</xsl:stylesheet>
</context>
<expect label="produces an empty stylesheet"
context="xsl:stylesheet">
<xsl:stylesheet />
</expect>
</scenario>
</scenario>
<!-- xsl:transform is an alternative to xsl:stylesheet -->
<scenario label="given a xsl:template root note">
<context>
<xsl:transform />
</context>
<expect label="properly outputs stylesheet"
context="xsl:stylesheet">
<xsl:stylesheet />
</expect>
</scenario>
</description>