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 - 遍历所有子节点的主要内容,如果未能解决你的问题,请参考以下文章