【问题标题】:XSLT - Looping through all child nodesXSLT - 遍历所有子节点
【发布时间】: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。据我所知,这应该可以解决问题。

标签: xml xslt-1.0


【解决方案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 不用担心。我回答了他的问题,在这个过程中教会了他一些东西。然后他回答了他自己的问题并给了我信任。我认为这是公平的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多