Re: Reading doctype-public and doctype-system from xsl:output

Thanks Philip. This is a good solution to access the doctype  
information. Then to validate against a DTD I guess you would need  
either to call an external program using p:exec or to implement a  
custom p:validate-with-dtd step.

As for the 'stylesheet' port of p:xslt, as far as I understand the  is  
not accessible because it is an input port (you cannot pipe it to  
other steps.

Romain.

Le 15 juin 10 à 09:54, Philip Fennell a écrit :

> Romain wrote:
>
> > Also, note that the xsl:output element in you XSLT defines  
> *serialization* options,
> > which means that the XML infoset flowing through your pipeline  
> won't retain this information
>
> This is very true, but, you can get access to the system and public  
> parts of the Doctype declared for the serialization of the XSLT  
> Transform by 'introducing' the Transform as a normal XML document  
> and then you can reference any parts of it you like - see below.
>
> However, one thing I've discovered with XProc (Calabash and Calumet  
> implementations) is that the 'stylesheet' port of p:xslt is not  
> accessible. In the example below I wanted to use:
>
> <p:with-option name="attribute-value" select="/xsl:transform/ 
> xsl:output/@doctype-system">
>   <p:pipe port="stylesheet" step="transform"/>
> </p:with-option>
>
> Which would have been clearer and more concise than the work-around  
> I've had to use. Maybe in XProc 1.1 we could have access to such  
> ports.
>
>
>
> <?xml version="1.0" encoding="UTF-8"?>
> <p:declare-step
>     xmlns:c="http://www.w3.org/ns/xproc-step"
>     xmlns:p="http://www.w3.org/ns/xproc"
>     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>     exclude-inline-prefixes="c p xsl"
>     name="test"
>     version="1.0">
> <p:input port="source">
>   <p:inline>
>     <doc>Hello world!</doc>
>     </p:inline>
> </p:input>
> <p:output port="result"/>
>
> <p:identity name="stylesheet">
>   <p:input port="source">
>     <p:inline>
>       <xsl:transform
>           xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>           xmlns:xs="http://www.w3.org/2001/XMLSchema"
>           exclude-result-prefixes="xs"
>           version="2.0">
>
>         <xsl:output encoding="UTF-8"
>             doctype-public="-//NISO//DTD dtbook 2005-2//EN"
>             doctype-system="http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd 
> "
>             indent="yes" media-type="application/xml"
>             method="xml"/>
>
>         <xsl:template match="/*">
>           <xsl:copy-of select="."/>
>         </xsl:template>
>       </xsl:transform>
>     </p:inline>
>   </p:input>
> </p:identity>
>
> <p:xslt name="transform">
>   <p:input port="source">
>     <p:pipe port="source" step="test"/>
>   </p:input>
>   <p:input port="stylesheet">
>     <p:pipe port="result" step="stylesheet"/>
>   </p:input>
>   <p:input port="parameters">
>     <p:empty/>
>   </p:input>
> </p:xslt>
>
>   <p:wrap-sequence wrapper="job-bag"/>
>
>   <p:add-attribute match="/*" attribute-name="public">
>     <p:with-option name="attribute-value" select="/xsl:transform/ 
> xsl:output/@doctype-public">
>       <p:pipe port="result" step="stylesheet"/>
>     </p:with-option>
>   </p:add-attribute>
>
>   <p:add-attribute match="/*" attribute-name="system">
>     <p:with-option name="attribute-value" select="/xsl:transform/ 
> xsl:output/@doctype-system">
>       <p:pipe port="result" step="stylesheet"/>
>     </p:with-option>
>   </p:add-attribute>
> </p:declare-step>
>
>
> The result of this pipeline is:
>
> <job-bag
>     public="-//NISO//DTD dtbook 2005-2//EN"
>     system="http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd">
>   <doc>Hello world!</doc>
> </job-bag>
>
>
>
> Regards
>
> Philip Fennell
>
> Consultant
>
> Mark Logic Corporation
>
>
> From: xproc-dev-request@w3.org [xproc-dev-request@w3.org] On Behalf  
> Of Romain Deltour [rdeltour@gmail.com]
> Sent: 14 June 2010 21:57
> To: xproc-dev@w3.org
> Subject: Re: Reading doctype-public and doctype-system from xsl:output
>
> Hi Jostein,
>
> The p:validate-with-xml-schema step can only be used to validate  
> against an XML Schema (see [1]). If you need to validate a document  
> against a DTD you would have to use the p:load step (see [2]) with  
> the @dtd-validate attribute. Note that if it will fail if the  
> underlying XML parser is not a validating parser.
>
> Also, note that the xsl:output element in you XSLT defines  
> *serialization* options, which means that the XML infoset flowing  
> through your pipeline won't retain this information (it doesn't  
> matter if the XLST asks the output to be serialized with UTF8, or  
> indented, etc).
>
> Hope this helps,
> Romain.
>
> [1] http://www.w3.org/TR/xproc/#c.validate-with-xml-schema
> [2] http://www.w3.org/TR/xproc/#c.load
>
> Le 14 juin 10 à 16:03, Jostein Austvik Jacobsen a écrit :
>
>> Hi.
>>
>> How can I use the DTD defined in the doctype, where the doctype is  
>> defined in a xsl:output in a p:xslt step, to validate and p:store  
>> the resulting XML? Here's some code to demonstrate my problem:
>>
>> ---- begin input.xml ----
>> <?xml version="1.0" encoding="windows-1252"?>
>> <!DOCTYPE document SYSTEM "http://www.idunn.no/dtd/document1.5_Idunn.dtd 
>> ">
>> <document>
>>       <metaData>
>>             <title>Hello XProc!</title>
>>             <logicalTitle>ht-2009-4-1</logicalTitle>
>>             <description/>
>>             <language>no_NO</language>
>>             <commenting>off</commenting>
>>             <indexing>on</indexing>
>>             <subject/>
>>             <categoryPrimary/>
>>             <author>
>>                   <firstName/>
>>                   <lastName/>
>>             </author>
>>             <contentType>content_document_editorial</contentType>
>>             <colleague>false</colleague>
>>       </metaData>
>>       <contributors/>
>>       <contentSection>
>>             <para>Hello XProc!</para>
>>       </contentSection>
>> </document>
>> ---- end input.xml ----
>>
>>
>> ---- begin transform.xsl ----
>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
>> version="2..0" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
>> xmlns:mf="http://example.com/2009/mf" exclude-result-prefixes="xs  
>> mf" xmlns="http://www.daisy.org/z3986/2005/dtbook/">
>>
>>     <!--
>>         Here I specify the doctype, and I would assume that it  
>> carried through to the XProc script, however that seems not to be  
>> the case.
>>     -->
>>     <xsl:output method="xml" version="1.0" doctype-public="-//NISO// 
>> DTD dtbook 2005-2//EN" doctype-system="http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd 
>> " encoding="utf-8"/>
>>
>>     <xsl:template match="document">
>>         <dtbook xmlns="http://www.daisy.org/z3986/2005/dtbook/"  
>> version="2005-2" xml:lang="no">
>>             <head/>
>>             <book showin="blp">
>>                 <xsl:apply-templates select="contentSection"/>
>>             </book>
>>         </dtbook>
>>     </xsl:template>
>>     <xsl:template match="contentSection">
>>         <bodymatter>
>>             <level1>
>>                 <h1><xsl:value-of select="/document/metaData[1]/ 
>> title[1]"></xsl:value-of></h1>
>>                 <xsl:apply-templates/>
>>             </level1>
>>         </bodymatter>
>>     </xsl:template>
>>     <xsl:template match="para">
>>         <p><xsl:apply-templates/></p>
>>     </xsl:template>
>> </xsl:stylesheet>
>>
>> ---- end transform.xsl ----
>>
>>
>> ---- begin pipe.xpl ----
>> <?xml version="1.0" encoding="UTF-8"?>
>> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step 
>> " version="1.0">
>>
>>     <p:input port="source" primary="true">
>>         <p:document href="input.xml"/>
>>     </p:input>
>>
>>     <p:xslt version="1.0">
>>         <p:input port="parameters">
>>             <p:empty/>
>>         </p:input>
>>         <p:input port="stylesheet">
>>             <p:document href="transform.xsl"></p:document>
>>         </p:input>
>>     </p:xslt>
>>
>>     <!--  How would I validate the XML here? I would prefer to use  
>> the DTD specified
>>         in the output from the XSLT transformation instead of  
>> explicitly setting
>>         a URL to it: -->
>>     <!-- <p:validate-with-xml-schema/> -->
>>
>>     <p:store href="dtbook.xml">
>>         <!--
>>             If I don't specify the doctype as options here, then  
>> the resulting
>>             document doesn't get a <!DOCTYPE ...>. I would like to  
>> pass through
>>             the doctype from the XSLT-transformation here.
>>         -->
>>         <p:with-option name="encoding" select="'UTF-8'"/>
>>         <p:with-option name="doctype-public" select="'-//NISO//DTD  
>> dtbook 2005-2//EN'"/>
>>         <p:with-option name="doctype-system" select="'http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd' 
>> "/>
>>     </p:store>
>>
>> </p:declare-step>
>> ---- end pipe.xpl ----
>>
>>
>> ---- begin dtbook.xml ----
>> <!DOCTYPE dtbook PUBLIC "-//NISO//DTD dtbook 2005-2//EN" "http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd 
>> ">
>> <dtbook xmlns="http://www.daisy.org/z3986/2005/dtbook/"  
>> version="2005-2" xml:lang="no">
>>   <head/>
>>   <book showin="blp">
>>     <bodymatter>
>>       <level1>
>>         <h1>Hello XProc!</h1>
>>         <p>Hello XProc!</p>
>>       </level1>
>>     </bodymatter>
>>   </book>
>> </dtbook>
>> ---- end dtbook.xml ----
>>
>>
>> The pipe.xpl-script takes input.xml as input, applies transform.xsl  
>> on it and stores the result as dtbook.xml. The code, as shown,  
>> should be all valid and run without errors, resulting in dtbook.xml  
>> (see comments in the code.) I'm using oXygen/Calabash.
>>
>>
>> Best regards
>> Jostein Austvik Jacobsen
>
>

Received on Tuesday, 15 June 2010 08:39:43 UTC