Re: Processing files in multiple directories

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 Saturday, 20 October 2012 19:11:41 UTC