Xml xslt模板只返回一行

Xml xslt模板只返回一行,xml,xslt,recursion,Xml,Xslt,Recursion,我有一个由另一个系统自动创建的xml文件,我需要从中提取数据并连接到另一组数据。节点是递归的,我尝试过使用xsl转换的模板/应用模板,但我总是只得到一行,而不是所有的行 以下是一个示例xml输出: <rdBookmarks> <Folders> <Folder Name="My Items" ID=""> <Folder ID="a04593ac-41d5-44b4-a895-d4b6abe29984" Name="Student

我有一个由另一个系统自动创建的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>


我发现答案非常有用,但它不能完全回答为什么我没有得到多行。您的模板只生成一行,因为该行是转换外部元素(文件夹/文件夹)而不是内部元素(文件夹/文件夹)的结果,并且只有一个外部元素

用以下内容替换第二个模板应该会在每个内部
元素的转换中生成一个
,但我不能确定生成的样式表是否会根据需要转换所有其他输入

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


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

那么我建议你这样做:

XSLT1.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>

感谢所有发表评论的人,您的回复帮助我找到了解决方案。我之所以只获取其中一个子文件夹而不是主文件夹或两个子文件夹,是因为我引用了父文件夹并调用了子文件夹的属性。我通过从selects中删除“Folder/”并在末尾添加“xsl:apply templates”修复了这个问题。这将遍历父文件夹,并将同一模板应用于子文件夹,以便列出所有文件夹

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


如果您希望提取子项,则需要在文件夹模板中添加一个文件。您在此处遵循的逻辑是什么?为什么要输出这两个文件夹而不是第三个文件夹?您是否只对没有子文件夹的文件夹感兴趣?或者别的什么?我对所有文件夹都感兴趣,而不仅仅是两个,所以在我的示例中,理想情况下它会输出3行,“我的项目”、“学生摘要”和“学生详细信息”