2015-12-30 258 views
0

我想弄清楚我的xsl文件有什么问题。这里是我的示例XML文件:XSLT输出不正确

<?xml version="1.0" encoding="UTF-8"?> 
<session xmlns="http://winscp.net/schema/session/1.0" name="[email protected]" 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> 

这是我的XSL文件:

<?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>&#13;&#10;</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>&#13;&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

,我得到的输出是:

filename,filedatetime,filetype 
-eof- 

我似乎无法弄清楚如何获取“文件名”,“修改”和“类型”元素的值。任何帮助,将不胜感激。

回答

1

<xsl:apply-templates select="file"/>将只匹配file类型的根节点的直接子节点,并且没有任何这些节点。

如果您想让任何深度的所有file孩子都可以使用<xsl:apply-templates select="//file"/>来代替。

XML有一个默认名称空间,所以XSL中的元素将不匹配,除非它们的名称空间也匹配。

以下似乎工作(注意,定义和使用xx命名空间):

<?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>&#13;&#10;</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>&#13;&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

感谢您的输入。我尝试添加“session/ls/files/file”,apply-template以及template select。它仍然不提供我期待的输出。 – sak

+1

感谢您的详细解释以及正确的代码。您的解决方案对我来说非常合适欣赏你的时间。 :) – sak