xslt模板只返回一行

时间:2014-10-21 19:21:22

标签: xml xslt recursion

我有一个xml文件,该文件由另一个系统自动创建,我需要将数据拉出并加入另一组数据。节点是递归的,我尝试使用xsl变换的模板/应用模板,但我总是只有一行而不是所有行。

以下是xml输出示例:

<rdBookmarks>
  <Folders>
    <Folder Name="My Items" ID="">
      <Folder ID="a04593ac-41d5-44b4-a895-d4b6abe29984" Name="Student Summary" SaveTime="2014-10-21T11:08:41-04:00" />
      <Folder ID="4ef6e607-710d-4c52-abf7-de7377e33bd6" Name="Student Detail" SaveTime="2014-10-21T11:17:51-04:00" />
    </Folder>
  </Folders>
</rdBookmarks>

这是我对xsl转换的最新尝试:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <rdData>
        <xsl:apply-templates />
    </rdData>
</xsl:template>
<xsl:template match="Folder">
    <Folder>
        <xsl:attribute name="ID">
            <xsl:value-of select="Folder/@ID" />
        </xsl:attribute>
        <xsl:attribute name="Folder">
            <xsl:value-of select="Folder/@Name" />
        </xsl:attribute>
    </Folder>
</xsl:template>
</xsl:transform>

我当前的输出格式正确,但它只返回一行,我无法弄清楚原因。

<rdData>
    <Folder ID="a04593ac-41d5-44b4-a895-d4b6abe29984" Folder="Student Summary"/>
</rdData>

我发现XSLT templates and recursion的答案非常有帮助,但它并没有完全回答为什么我没有获得多行。

3 个答案:

答案 0 :(得分:1)

  

我对所有文件夹感兴趣,而不仅仅是两个文件夹,所以在我的例子中   理想情况下,它会输出3行

然后我建议你这样试试:

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <rdData>
        <xsl:apply-templates/>
    </rdData>
</xsl:template>

<xsl:template match="Folder">
    <Folder>
        <xsl:copy-of select="@ID | @Name"/>
   </Folder>
    <xsl:apply-templates/>
</xsl:template>

</xsl:transform>

应用于您的输入示例,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<rdData>
   <Folder Name="My Items" ID=""/>
   <Folder ID="a04593ac-41d5-44b4-a895-d4b6abe29984" Name="Student Summary"/>
   <Folder ID="4ef6e607-710d-4c52-abf7-de7377e33bd6" Name="Student Detail"/>
</rdData>

答案 1 :(得分:0)

您的模板只生成一行,因为该行是转换外部<Folder>元素(文件夹/文件夹)而不是内部元素(文件夹/文件夹/文件夹)的结果,并且只有一行外部

使用以下内容替换第二个模板应该在转换中为每个内部<Folder>元素生成一个<Folder>,但我无法确定生成的样式表是否会根据需要转换所有其他输入。 / p>

<xsl:template match="Folder/Folder">
  <Folder>
    <xsl:attribute name="ID">
        <xsl:value-of select="@ID" />
    </xsl:attribute>
    <xsl:attribute name="Folder">
        <xsl:value-of select="@Name" />
    </xsl:attribute>
  </Folder>
</xsl:template>

答案 2 :(得分:0)

感谢所有评论的人,您的回复帮助我找到了解决方案。我只获得一个子文件夹而不是主文件夹或两个子文件夹的原因是因为我引用了父文件并调用了子文件的属性。我通过删除&#34;文件夹/&#34;来解决了这个问题。从选择和添加&#34; xsl:apply-templates&#34;在末尾。这将通过父项并将相同的模板应用于子项,以便列出所有文件夹。

<xsl:template match="Folder">
    <Folder>
        <xsl:attribute name="ID">
            <xsl:value-of select="@ID" />
        </xsl:attribute>
        <xsl:attribute name="Folder">
            <xsl:value-of select="@Name" />
        </xsl:attribute>
    </Folder>
    <xsl:apply-templates />
</xsl:template>