views:

1006

answers:

3

Is there a function in XSLT that can takes in a directory path and gives back all the files in it??

I have a xml file now reads like this

<filelist>
    <file>fileA.xml</file>
    <file>fileB.xml</file>
</filelist>

Now, there's directory called dir, has files fileX.xml, fileY.xml and a bunch of other xml files in it. I want to add these files on to the orginal xml file, so that I can get:

<filelist>
    <file>fileA.xml</file>
    <file>fileB.xml</file>
    <file>fileX.xml</file>
    <file>fileY.xml</file>
    .... <!-- other files -->
</filelist>

Is there an XSLT way to do this?? something that takes in a dir root, and is able to iterator through all of the files in it?? And then I could just call something like:

<xsl:element name = file >
     <xsl:copy> <!--whatever file name--> <xsl:copy>
</xsl:element>0

[Edit-solution]

all of the answers were very helpful. I ended up finding an external solution (using saxon). I thought it may be helpful for other people to post my solution here, although it is very specific to my own situation.

I use Ant to build a java web app and need to translate some xml files before deployment. Hence, I was using the xslt task to do the job by adding the "saxon9.jar" in the classpath. And in my xsl file, I just did something like this:

<xsl:for-each select="collection('../dir/?select=*.xml')" >
     <xsl:element name='file'>
        <xsl:value-of select="tokenize(document-uri(.), '/')[last()]"/>
     </xsl:element>
</xsl:for-each>
A: 

You should be able to use the document() function to read the XML files in. I'm not sure how well it is supported on various XSLT engines though.

This is a good example showing it in use.

But that doesn't address the problem of reading in the names of the files from the directory. The other answer gives a way of doing that side of it.

andynormancx
A: 

You can't do that in native XSLT, but various implementations allow you to add extensions to the functionality.

For example, in C# you can add a user defined URN:

 <xsl:stylesheet {snipped the usual xmlns stuff}
    xmlns:user="urn:user" >

then use the functions within "user"

  <xsl:value-of select="user:getdirectory( @mydir )" />

within the C# you associate "user" to a C# class:

 XSLThelper xslthelper   = new XSLThelper( );  // your class here
 xslArgs.AddExtensionObject( "urn:user", xslthelper );

and your class defines the "getdirectory" function:

public class XSLThelper
{
public string getdirectory(System.Xml.XPath.XPathNavigator xml, string strXPath, string strNULL)
{
       //blah
    }
}

Hugh amount of homework left here! MSDN Resource

Guy
+3  A: 
Tomalak