Xml xslt模板只返回一行
我有一个由另一个系统自动创建的xml文件,我需要从中提取数据并连接到另一组数据。节点是递归的,我尝试过使用xsl转换的模板/应用模板,但我总是只得到一行,而不是所有的行 以下是一个示例xml输出: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
<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行,“我的项目”、“学生摘要”和“学生详细信息”