- From: Norman Walsh <ndw@nwalsh.com>
- Date: Fri, 09 Apr 2010 11:17:56 -0400
- To: public-xml-processing-model-wg@w3.org
- Message-ID: <m28w8wlknv.fsf_-_@nwalsh.com>
"Grosso, Paul" <pgrosso@ptc.com> writes: > I'm not sure I appreciate all the considerations from > reading the minutes, but if we are going to create anything > even slightly beyond what we currently have in the document, > I would really like it to talk about xml-stylesheet if feasible. The xml-model and xml-stylesheet PIs only came into the conversation near the end of the meeting. I think we've actually decided not to do more, but rather to offer both we currently offer and *less*. By the way, handling the xml-model and xml-stylesheet PIs is no simple thing. Here's a pipeline that does it, to a first approximation. I'm not finished yet. <p:pipeline xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:cx="http://xmlcalabash.com/ns/extensions" xmlns:x="http://exproc.org/extension/steps" name="main" version="1.0"> <!-- validation options --> <p:option name="assert-valid" select="'true'"/> <p:option name="schematypens"/> <p:option name="group"/> <!-- style options --> <p:option name="type" select="'text/xsl'"/> <p:pipeline type="x:pi-to-xml"> <p:xslt> <p:input port="stylesheet"> <p:inline> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:f="http://docbook.org/xslt/ns/extension" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="f xs" version="2.0"> <xsl:template match="/"> <document-pis> <xsl:for-each select="/processing-instruction()"> <xsl:element name="{node-name(.)}"> <xsl:call-template name="parse-pseudo-atts"> <xsl:with-param name="value" select="normalize-space(.)"/> </xsl:call-template> </xsl:element> </xsl:for-each> </document-pis> </xsl:template> <xsl:template name="parse-pseudo-atts" as="attribute()*"> <xsl:param name="value" as="xs:string"/> <xsl:choose> <xsl:when test="$value = ''"> <xsl:sequence select="()"/> </xsl:when> <!-- N.B.: this matches only a small subset of legal attr names --> <xsl:when test="matches($value, '^[A-Za-z0-9_][-A-Za-z_0-9]*=["'']')"> <xsl:variable name="n" select="replace($value,'^(.*?)=.*','$1')"/> <xsl:variable name="q" select="replace($value,'^.*?=(.).*','$1')"/> <xsl:variable name="vmatch" select="concat('^.*?=',$q,'(.*?)',$q,'(.*)')"/> <xsl:variable name="v" select="replace($value,$vmatch,'$1')"/> <xsl:variable name="rest" select="normalize-space(replace($value, $vmatch, '$2'))"/> <xsl:attribute name="{$n}" select="$v"/> <xsl:call-template name="parse-pseudo-atts"> <xsl:with-param name="value" select="$rest"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <!-- Not a list of pseudo-attributes, bail. --> <xsl:sequence select="()"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> </p:inline> </p:input> </p:xslt> </p:pipeline> <p:declare-step type="x:filter-sequence"> <p:input port="source" sequence="true"/> <p:output port="result" sequence="true"/> <p:option name="select" required="true"/> <p:for-each> <p:filter> <p:with-option name="select" select="$select"/> </p:filter> </p:for-each> </p:declare-step> <p:declare-step type="x:validate" name="main"> <p:input port="source" primary="true"/> <p:input port="schema"/> <p:output port="result"/> <p:option name="schematypens" required="true"/> <p:option name="assert-valid" select="'true'"/> <p:option name="phase" select="''"/> <p:choose> <p:when test="$schematypens = 'http://relaxng.org/ns/structure/1.0'"> <p:validate-with-relax-ng> <p:input port="schema"> <p:pipe step="main" port="schema"/> </p:input> <p:with-option name="assert-valid" select="$assert-valid"/> </p:validate-with-relax-ng> </p:when> <p:when test="$schematypens = 'http://www.w3.org/2001/XMLSchema'"> <p:validate-with-xml-schema> <p:input port="schema"> <p:pipe step="main" port="schema"/> </p:input> <p:with-option name="assert-valid" select="$assert-valid"/> </p:validate-with-xml-schema> </p:when> <p:when test="$schematypens = 'http://purl.oclc.org/dsdl/schematron'"> <p:choose> <p:when test="string($phase) != ''"> <p:validate-with-schematron> <p:input port="schema"> <p:pipe step="main" port="schema"/> </p:input> <p:input port="parameters"> <p:empty/> </p:input> <p:with-option name="assert-valid" select="$assert-valid"/> <p:with-option name="phase" select="$phase"/> </p:validate-with-schematron> </p:when> <p:otherwise> <p:validate-with-schematron> <p:input port="schema"> <p:pipe step="main" port="schema"/> </p:input> <p:input port="parameters"> <p:empty/> </p:input> <p:with-option name="assert-valid" select="$assert-valid"/> </p:validate-with-schematron> </p:otherwise> </p:choose> </p:when> <p:when test="$schematypens='http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0'"> <!-- FIXME: use extension step --> <p:identity/> </p:when> <p:otherwise> <!-- FIXME: unrecognized type --> <p:identity/> </p:otherwise> </p:choose> </p:declare-step> <x:pi-to-xml name="get-pis"/> <p:identity> <p:input port="source" select="/document-pis/xml-model"/> </p:identity> <p:choose> <p:xpath-context> <p:empty/> </p:xpath-context> <p:when test="p:value-available('group')"> <x:filter-sequence> <p:with-option name="select" select="concat('/*[@group="',$group,'"]')"> <p:empty/> </p:with-option> </x:filter-sequence> </p:when> <p:otherwise> <p:identity> <p:input port="source" select="/*[not(@group)]"/> </p:identity> </p:otherwise> </p:choose> <p:choose> <p:xpath-context> <p:empty/> </p:xpath-context> <p:when test="p:value-available('schematypens')"> <x:filter-sequence> <p:with-option name="select" select="concat('/*[@schematypens="',$schematypens,'"]')"> <p:empty/> </p:with-option> </x:filter-sequence> </p:when> <p:otherwise> <p:identity/> </p:otherwise> </p:choose> <p:split-sequence test="true()" initial-only="true" name="xml-model"/> <p:count name="xml-model-count"/> <p:choose> <p:xpath-context> <p:pipe step="xml-model" port="matched"/> </p:xpath-context> <p:when test="/c:result = '0'"> <p:xpath-context> <p:pipe step="xml-model-count" port="result"/> </p:xpath-context> <p:identity> <p:input port="source"> <p:pipe step="main" port="source"/> </p:input> </p:identity> </p:when> <p:when test="/*/@type = 'application/xml-dtd'"> <!-- I'm not prepared to deal with an alternate DTD, --> <!-- but I'll do a validating parse for you... --> <p:load dtd-validate="true"> <p:with-option name="href" select="base-uri(/)"> <p:pipe step="main" port="source"/> </p:with-option> </p:load> </p:when> <p:when test="/*/@type = 'application/relax-ng-compact-syntax'"> <!-- FIXME: --> <p:identity> <p:input port="source"> <p:pipe step="main" port="source"/> </p:input> </p:identity> </p:when> <p:otherwise> <p:variable name="pistns" select="/*/@schematypens"> <p:pipe step="xml-model" port="matched"/> </p:variable> <p:load name="load-schema"> <p:with-option name="href" select="/*/@href"> <p:pipe step="xml-model" port="matched"/> </p:with-option> </p:load> <x:validate> <p:input port="source"> <p:pipe step="main" port="source"/> </p:input> <p:input port="schema"> <p:pipe step="load-schema" port="result"/> </p:input> <p:with-option name="schematypens" select="if ($pistns != '') then $pistns else namespace-uri(/*)"> <p:pipe step="load-schema" port="result"/> </p:with-option> </x:validate> </p:otherwise> </p:choose> <p:identity name="validated"/> <p:identity> <p:input port="source" select="/document-pis/xml-stylesheet"> <p:pipe step="get-pis" port="result"/> </p:input> </p:identity> <x:filter-sequence> <p:with-option name="select" select="concat('/*[@type="',$type,'"]')"> <p:empty/> </p:with-option> </x:filter-sequence> <p:split-sequence test="true()" initial-only="true" name="xml-stylesheet"/> <p:count name="xml-stylesheet-count"/> <p:choose name="styled"> <p:xpath-context> <p:pipe step="xml-stylesheet" port="matched"/> </p:xpath-context> <p:when test="/c:result = '0'"> <p:xpath-context> <p:pipe step="xml-stylesheet-count" port="result"/> </p:xpath-context> <p:identity> <p:input port="source"> <p:pipe step="validated" port="result"/> </p:input> </p:identity> </p:when> <p:otherwise> <p:load name="load-style"> <p:with-option name="href" select="/*/@href"> <p:pipe step="xml-stylesheet" port="matched"/> </p:with-option> </p:load> <p:xslt> <p:input port="source"> <p:pipe step="validated" port="result"/> </p:input> <p:input port="stylesheet"> <p:pipe step="load-style" port="result"/> </p:input> </p:xslt> </p:otherwise> </p:choose> </p:pipeline> Be seeing you, norm -- Norman Walsh <ndw@nwalsh.com> | Art happens--no hovel is safe from it, http://nwalsh.com/ | no prince may depend upon it, and | vastest intelligence cannot bring it | about.--J. M. Whistler
Received on Friday, 9 April 2010 15:18:33 UTC