XSLT输出不正确

时间:2015-12-30 15:44:16

标签: xslt

我试图找出我的xsl文件有什么问题。这是我的示例xml文件:

.PHONY: clean

这是我的xsl文件:

    <?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>

我得到的输出是:

<?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>

我似乎无法弄清楚如何获取&#34; filename&#34;,&#34;修改&#34;的值。和&#34;键入&#34;元素。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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>