xsl-list
[Top] [All Lists]

RE: [xsl] sequential numbering in xslt

2010-01-04 15:56:52

Can I not use the complete file path in the colleciton() 
function with Saxon?

No, the argument has to be a URI, not a file path.

Try select="collection('file:///C:/input/?select=*.xml')"

Oh, and try reading the documentation: it usually saves time compared with
guessing.

http://www.saxonica.com/documentation/sourcedocs/collections.html

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 


On Mon, Jan 4, 2010 at 11:52 AM, James A. Robinson 
<jim(_dot_)robinson(_at_)stanford(_dot_)edu> wrote:

another XML format using XSLT. The output XML file has a 
schema and 
has a required 'seq' attribute in the root element that 
needs to be 
incremented for each input XML file.
...
for every input file, in the transformation, I want to increment 
attribute 'seq' in the output file by 1 when I transform the input 
files using xslt.
I  have tried <xsl:number> and tried writing a function. But the 
problem is that since variables in xslt are constants, there is no 
way to increment a number, store it in a temp variable and 
increment 
it for the next time in xslt 2.0 unlike procedural 
languages like C 
or
C++.

Is there any other way of achieving this in XSLT 2.0?

Using position() is one option, keeping track of the number of 
documents you are processing yourself, using a recursive 
template, is 
another:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";

 xmlns:xs="http://www.w3.org/2001/XMLSchema";

 exclude-result-prefixes="xs">

 <!-- URI approporiate for fn:collection, e.g., in
      saxon:

      <collection stable="true">
        <doc href="file1.xml" />
        <doc href="file2.xml" />
        <doc href="file3.xml" />
      </collection>
 -->
 <xsl:param name="collection-href" required="yes" />

 <!-- Previous sequence number, if we need to start at
      some point other than 1. -->
 <xsl:param name="previous-number" select="0" />


 <xsl:template match="/">
   <xsl:call-template name="example">
     <xsl:with-param name="documents" 
select="collection($collection-href)" />
     <xsl:with-param name="previous-number" 
select="$previous-number" 
/>
   </xsl:call-template>
 </xsl:template>

 <xsl:template name="example">
   <xsl:param name="documents" />
   <xsl:param name="previous-number" required="yes" />

   <xsl:if test="$documents[1]">
     <xsl:variable name="current-number" as="xs:integer" 
select="xs:integer($previous-number+1)" />

     <!-- Here we could use xsl:result-document and 
xsl:apply-templates
          to kick off processing of our input document. -->
     <example seq="{$current-number}" />

     <!-- Now we recursively process the next document in 
our list -->
     <xsl:call-template name="example">
       <xsl:with-param name="documents" 
select="remove($documents, 1)" 
/>
       <xsl:with-param name="previous-number" 
select="$current-number" 
/>
     </xsl:call-template>
   </xsl:if>

   <!-- Here, if not($documents), we could write out our
        last number to some file that we use to track our
        sequence number across time. -->
 </xsl:template>

</xsl:stylesheet>

Running this w/ the example collection document and no override of 
$previous-number would produce

<example seq="1"/>
<example seq="2"/>
<example seq="3"/>

whereas setting $previous-number to 3 would produce

<example seq="4"/>
<example seq="5"/>
<example seq="6"/>


Jim

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - 
James A. Robinson                       
jim(_dot_)robinson(_at_)stanford(_dot_)edu 
Stanford University HighWire Press      
http://highwire.stanford.edu/
+1 650 7237294 (Work)                   +1 650 7259335 (Fax)


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--