XSLT - 遍历所有子节点

Posted

技术标签:

【中文标题】XSLT - 遍历所有子节点【英文标题】:XSLT - Looping through all child nodes 【发布时间】:2013-09-13 11:05:48 【问题描述】:

别开枪我只是这里的信使,但我有一些看起来像这样的xml

<XMLSnippet>
    <data>
        <stuff value="stuff" />
        <stuff value="more stuff" />
        <stuff value="even more stuff" />
        <widget value="you expected stuff didn't you" />
        <stuff value="great, we've got stuff again" />
    </data>
</XMLSnippet>

我想遍历所有data子节点并输出以下内容

stuff
more stuff
even more stuff
you expected stuff didn't you
great, we've got stuff again

我是否仅限于使用 XSLT 1.0

谢谢!

【问题讨论】:

有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含重现问题的有效代码。有关指导,请参见 SSCCE.org。 @AlexandreP.Levasseur - 我很乐意提供我编写的 XSLT 代码,除非我没有,因为我不知道如何解决这个问题。 那么您到底遇到了什么问题?你知道如何在给定结构的情况下选择所有data 元素吗?你知道如何只选择给定返回所有相关元素的 XPath 查询的元素属性吗? @AlexandreP.Levasseur - 我的问题是,如果我循环遍历“stuff”节点,如 Phil 在他的回答中所示,“widget”节点将不会在正确的位置输出。我需要找到一种方法来循环遍历子节点,而不是通过它们的类型(?),而是通过数据节点的所有子节点。 只需将他的data/stuff 替换为data 并将他的@value 替换为*/@value。据我所知,这应该可以解决问题。 【参考方案1】:

感谢 Phil 和 Alexandre 的建议,这是我开始工作的代码

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/XMLSnippet">
       <xsl:for-each select="data/*">
          <xsl:value-of select="@value" />
       </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

【讨论】:

【参考方案2】:

这是一个基本的 XSLT 问题,所以我假设您在您的帖子中对 xsl 几乎没有经验。您需要了解 xslt 如何处理超出本文范围的 XML 文档。不过,这应该可以帮助您入门。请注意,有几种方法可以获得您想要的输出,这只是其中一种:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="XMLSnippet">
    <xsl:for-each select="data/stuff">
        <xsl:value-of select="@value"/>
    </xsl:for-each>
</xsl:template>

对于初学者,模板 match="/" 是您的入口点。 apply-templates 是一个 xslt 指令,它告诉 xslt 处理器在上下文中应用节点的模板。在这种情况下,您的根节点“XMLSnippet”。

for-each select="data/stuff" 以及 select="@value" 的值应该是不言自明的,除了 @ 用于选择属性。

祝你好运。我建议您阅读这本书XSLT 2.0。一本关于 XSLT 的好书。

【讨论】:

你说得对,我的经验有限。我的问题还在于需要显示“小部件”值。如果我是正确的,您的代码只会显示“东西”节点。 为什么这个答案被标记为正确?在循环结构中省略“小部件”元素似乎意味着问题的要求没有得到解决。 @twindham - 在 xslt 中,您根本不“循环”通过节点,而是访问节点。至于答案,我向 OP 展示了如何选择每个节点。在这种情况下,data/stuff 是节点。假设这已经足够了,既然他们将其标记为已回答,那就是。 @PhillyNJ 您的评论是正确的。我应该向 dscl 提出我的问题。他对该线程的第一条评论指出,您的解决方案没有按需要访问“小部件”值。然后他继续为这个问题添加一个单独的答案,该答案确实成功地访问了他的所有“东西”元素和“小部件”元素。在我看来,他对这个问题的回答应该被标记为正确而不是你的,这似乎是合乎逻辑的。在我的思考过程中,我有什么遗漏吗? @twindham 不用担心。我回答了他的问题,在这个过程中教会了他一些东西。然后他回答了他自己的问题并给了我信任。我认为这是公平的。

以上是关于XSLT - 遍历所有子节点的主要内容,如果未能解决你的问题,请参考以下文章

EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中

循环遍历节点并使用 XSLT 将值附加到字符串

高手帮忙:sql 里怎样递归判断父节点和子节

每天一算:二叉树的中序遍历

ztree获取当前选中节点子节点id集合的方法(转载)

使用 XSLT 基于 ID 从多个 xPath 中选择 XML 节点