- From: Jostein Austvik Jacobsen <josteinaj@gmail.com>
- Date: Sun, 21 Oct 2012 20:20:26 +0200
- To: Mansour Al Akeel <mansour.alakeel@gmail.com>
- Cc: xproc-dev@w3.org
- Message-ID: <CAOCxfQefQKUaOtMWCht6nSfswO_TDjFPwKYkqDf0FzWYfpoTBw@mail.gmail.com>
Troubleshooting XProc is not too easy at the moment. You'll often be faced
with a not-so-informative error message with no reference to line number or
even which file causes the error. I'll share how I deal with debugging
though:
>From my experience:
* it's generally a lot more difficult to debug inlined XSLTs as opposed to
XSLTs stored in separate files. So even for simple XSLTs, store them in
separate files and import them using <p:document .../> when needed.
* if the XProc script doesn't compile or run successfully, use the
elimination method (i.e. comment out more and more of the code until it
does compile and run)
* if it runs successfully but gives unexpected results, I pipe the parts
of the XProc that I need to inspect into a debug output port like this
(similar to what p:log does, but I'm used to doing it this way):
<p:declare-step ...>
<p:output port="result" sequence="true">
<p:pipe port="result" step="debug"/>
<p:pipe port="result" step="debug-2"/>
</p:output>
...
<p:identity name="debug"/>
<p:xslt>...</p:xslt>
<p:identity name="debug-2"/>
...
</p:declare-step>
Jostein
On Sat, Oct 20, 2012 at 7:41 PM, Mansour Al Akeel <mansour.alakeel@gmail.com
> wrote:
> Thank you Jostein,
> The attachment you sent works with no issues.
> However being a newbie to xslt, I have been looking into getting my
> code to work, and find my mistake.
> This is my example, which doesn't use the directory listing function
> included with your code and it's not recursive.
>
> It shows how to pipe xslt output into another one. I like to improve
> my trouble shooting skills, and be able to
> easily my steps. May be will look into <p:log />. Not sure if there's
> a better way to see what is going on.
>
> Thank you a lot.
>
> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
> xmlns:c="http://www.w3.org/ns/xproc-step"
> xmlns:cx="http://xmlcalabash.com/ns/extensions"
> name="myPipeline"
> version="1.0">
>
> <p:output port="result" sequence="true"/>
>
> <p:variable name="path"
> select="'file:///home/mansour/workspace/test/xproc_test/xml_files/'">
> <p:empty/>
> </p:variable>
>
> <p:directory-list>
> <p:with-option name="path" select="$path">
> <p:empty/>
> </p:with-option>
> </p:directory-list>
>
> <p:for-each name="directoryloop">
>
> <p:output port="result" sequence="true"/>
>
> <p:iteration-source select="/c:directory/c:directory"/>
>
> <p:variable name="dirpath"
> select="p:resolve-uri(concat(c:directory/@name, '/'),$path)"/>
>
> <p:directory-list>
> <p:with-option name="path" select="$dirpath"/>
> </p:directory-list>
>
> <p:make-absolute-uris match="c:file/@name">
> <p:with-option name="base-uri" select="$dirpath"/>
> </p:make-absolute-uris>
>
> <!-- <p:identity /> -->
>
> <p:for-each name="fileloop">
> <p:iteration-source select="//c:file"/>
> <p:variable name="file" select="/c:file/@name"/>
> <p:load name="file">
> <p:with-option name="href" select="$file"/>
> </p:load>
> <!-- <p:identity /> -->
> <p:xslt name="aggregation-step">
> <p:input port="parameters">
> <p:empty />
> </p:input>
> <p:input port="stylesheet">
> <p:inline>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:strip-space elements="*"/>
> <xsl:output method="xml" indent="yes"/>
>
> <xsl:template match="/" >
> <ele>
> <xsl:value-of select="." />
> </ele>
> </xsl:template>
>
> </xsl:stylesheet>
> </p:inline>
> </p:input>
> </p:xslt>
> <!-- <p:wrap-sequence wrapper="message"/> -->
> </p:for-each>
>
> <p:wrap-sequence wrapper="root"/>
>
> </p:for-each>
>
> <!-- <p:xslt name="cleaning-step"> -->
> <!-- <p:input port="parameters"> -->
> <!-- <p:empty /> -->
> <!-- </p:input> -->
> <!-- <p:input port="stylesheet"> -->
> <!-- <p:inline> -->
> <!-- <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> -->
> <!-- <xsl:strip-space elements="*"/> -->
> <!-- <xsl:output method="xml" indent="yes"/> -->
> <!-- <xsl:template match="/" > -->
> <!-- <cleaned> -->
> <!-- <xsl:apply-templates /> -->
> <!-- </cleaned> -->
> <!-- </xsl:template> -->
> <!-- </xsl:stylesheet> -->
> <!-- </p:inline> -->
> <!-- </p:input> -->
> <!-- </p:xslt> -->
>
> <!-- Adds the time stamp and revision to the resulting XML File -->
> <!-- and a count for the main elements in the file -->
> <p:xslt name="stamping-step">
> <p:input port="parameters">
> <p:empty />
> </p:input>
> <p:input port="stylesheet">
> <p:inline>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:strip-space elements="*"/>
> <xsl:output method="xml" indent="yes"
> omit-xml-declaration="no"
> version="1.0" encoding="utf-8"/>
>
> <xsl:template match="/" >
> <wrapper>
> <xsl:text>
> </xsl:text>
> <xsl:comment>Generated on <xsl:value-of
> select="current-dateTime()"/>.</xsl:comment>
> <xsl:comment>Processed <xsl:value-of
> select="count(*/*)"/>.</xsl:comment>
> <xsl:text>
> </xsl:text>
> <xsl:apply-templates />
> </wrapper>
> </xsl:template>
>
> </xsl:stylesheet>
> </p:inline>
> </p:input>
> </p:xslt>
> </p:declare-step>
>
>
>
>
>
> On Fri, Oct 19, 2012 at 5:41 AM, Jostein Austvik Jacobsen
> <josteinaj@gmail.com> wrote:
> > I've attached an example that iterates recursively through a directory of
> > XML files, loads them, applies an XSLT transform, combines them and
> outputs
> > in on the primary output port.
> >
> > Here's an example of how to do recursive directory listing:
> > http://xproc.org/library/recursive-directory-list.xpl
> > It will give you something like this:
> > <c:directory xmlns:c="http://www.w3.org/ns/xproc-step" name="dir"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/">
> > <c:directory name="dir1"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir1/">
> > <c:file name="1.xml"/>
> > <c:file name="2.xml"/>
> > </c:directory>
> > <c:directory name="dir2"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir2/">
> > <c:file name="3.xml"/>
> > <c:file name="4.xml"/>
> > </c:directory>
> > </c:directory>
> >
> > If you then run <p:add-xml-base all="true" relative="false"/> on it,
> you'll
> > get something that's easier to work with:
> > <c:directory xmlns:c="http://www.w3.org/ns/xproc-step" name="dir"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/">
> > <c:directory name="dir1"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir1/">
> > <c:file name="1.xml"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir1/"/>
> > <c:file name="2.xml"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir1/"/>
> > </c:directory>
> > <c:directory name="dir2"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir2/">
> > <c:file name="3.xml"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir2/"/>
> > <c:file name="4.xml"
> > xml:base="file:/home/jostein/Skrivebord/xproc-subdir-xslt/dir/dir2/"/>
> > </c:directory>
> > </c:directory>
> >
> > Then simply iterate through all the c:file elements, resolve the @name
> > against @xml:base to get the full URI to the files, load the files and
> apply
> > the XSLT you want:
> > <p:for-each>
> > <p:iteration-source select="//c:file"/>
> > <p:variable name="href"
> select="p:resolve-uri(/*/@name,/*/@xml:base)"/>
> > <p:load>
> > <p:with-option name="href" select="$href"/>
> > </p:load>
> > <p:xslt>
> > <p:input port="parameters">
> > <p:empty/>
> > </p:input>
> > <p:input port="stylesheet">
> > <p:document href="beverage.xslt"/>
> > </p:input>
> > </p:xslt>
> > </p:for-each>
> >
> >
> > Hope this helps. :)
> >
> > Jostein
> >
> >
> >
> > On Fri, Oct 19, 2012 at 1:40 AM, Mansour Al Akeel
> > <mansour.alakeel@gmail.com> wrote:
> >>
> >> I am new to Xproc, and by reading about it, I thought it can be help
> >> me making things cleaner.
> >> I have many xml files in 3 directories. These files have to pass an
> >> XSLT transformation. The results is aggregated into one single file
> >> and a root node is added.
> >> This is currently done with the help of Java. Then the resulting file
> >> has to go through multiple XSLTs before getting the final results.
> >>
> >> I found this article useful, showing how to use p:directory-list
> >>
> >>
> >>
> http://www.proxml.be/users/paul/weblog/1722f/Directory_listings_in_XProc.html
> >>
> >>
> >> But then how do I apply a transformation for each file in a loop, and
> >> send the results to the rest of the style sheets ??
> >>
> >> Thank you in advance.
> >>
> >>
> >
>
Received on Sunday, 21 October 2012 18:21:14 UTC