Reputation: 15
I am trying to figure out what is wrong with my xsl file. Here is my sample xml file:
<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="user@host" start="2015-12-30T14:55:40.156Z">
<ls>
<destination value="/test/folder" />
<files>
<file>
<filename value="folder1" />
<type value="d" />
<modification value="2015-03-04T21:09:25.000Z" />
<permissions value="rwxrw-rw-" />
</file>
<file>
<filename value="folder2" />
<type value="d" />
<modification value="2015-03-04T21:08:47.000Z" />
<permissions value="rwxrw-rw-" />
</file>
<file>
<filename value="folder3" />
<type value="d" />
<modification value="2015-03-04T21:08:57.000Z" />
<permissions value="rwxrw-rw-" />
</file>
<file>
<filename value="folder4" />
<type value="d" />
<modification value="2015-03-04T21:09:14.000Z" />
<permissions value="rwxrw-rw-" />
</file>
<file>
<filename value="file1.txt" />
<type value="-" />
<size value="113" />
<modification value="2015-12-30T14:55:07.000Z" />
<permissions value="rw-rw-rw-" />
</file>
</files>
<result success="true" />
</ls>
</session>
This is my xsl file:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="/">
<xsl:text>filename,filedatetime,filetype</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="file"/>
<xsl:text>-eof-</xsl:text>
</xsl:template>
<xsl:template match="file">
<xsl:text>"</xsl:text>
<xsl:value-of select="filename/@value" />
<xsl:text>","</xsl:text>
<xsl:value-of select="modification/@value" />
<xsl:text>","</xsl:text>
<xsl:value-of select="type/@value" />
<xsl:text>"</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
The output that I am getting is:
filename,filedatetime,filetype
-eof-
I cannot seem to figure out how to get the values of "filename", "modification" and "type" elements. Any help would be appreciated.
Upvotes: 0
Views: 73
Reputation: 20620
The line <xsl:apply-templates select="file"/>
will only match immediate children of the root node of type file
and there aren't any of those.
If you want all file
children at any depth you could use <xsl:apply-templates select="//file"/>
instead.
The XML has a default namespace, so the elements in your XSL won't match unless their namespaces match too.
The following seems to work (note the definition and use of the xx
namespace):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xx="http://winscp.net/schema/session/1.0">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="/">
<xsl:text>filename,filedatetime,filetype</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="//xx:file" />
<xsl:text>-eof-</xsl:text>
</xsl:template>
<xsl:template match="xx:file">
<xsl:text>"</xsl:text>
<xsl:value-of select="xx:filename/@value" />
<xsl:text>","</xsl:text>
<xsl:value-of select="xx:modification/@value" />
<xsl:text>","</xsl:text>
<xsl:value-of select="xx:type/@value" />
<xsl:text>"</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Upvotes: 1