【问题标题】:XSLT: for-each div with part of childsXSLT:for-each div 与部分孩子
【发布时间】:2018-10-31 08:03:21
【问题描述】:

我在很短的时间内就开始使用 XSL,我必须使用子标签的一部分创建多个 div。所以我有这样的事情:

<Nodes>
    <Node>
        <Tag>a</Tag>
        <Tag>b</Tag>
    </Node>
    <Node>
        <Tag>c</Tag>
    </Node>
</Nodes>

我想我可以这样做:

<xsl:for-each select="/Nodes">
    <div id="node_{position()}">
        <xsl:for-each select="Node">
            <xsl:value-of select="Tag" />
        </xsl:for-each>
    </div>
</xsl:for-each>

而我需要的是:

<div>
    a
    b
</div>
<div>
    c
</div>

但我总是得到两个带有 b c 的 div。取而代之的是第一个带有b,另一个带有c。 我必须枚举标签或类似的东西吗?

编辑:

<ProjectTopology>
    <Nodes>
        <Node>
            <Tag>Section1</Tag>
            <Nodes>
                <Node>
                    <Tag>Another section1</Tag>
                    <Tag>Another section2</Tag>
                </Node>
            </Nodes>
            <Tag>Section2</Tag>
            <Nodes>
                <Node>
                    <Tag>Another section3</Tag>
                    <Tag>Another section4</Tag>
                </Node>
            </Nodes>
        </Node>
    </Nodes>
</ProjectTopology>

好的,我现在正在寻找这样的东西:

<div id="section_1">
    Another section1
    Another section2
</div>
<div id="section_2">
    Another section3
    Another section4
</div>

【问题讨论】:

标签: html xml xslt foreach transformation


【解决方案1】:

但我总是得到两个带有 b c 的 div。

不,这不是应用您在此处发布的代码的结果。实际结果是:

<div id="node_1">ac</div>

在 XSLT 1.0 中,并且:

<div id="node_1">a bc</div>

在 XSLT 2.0 中。

输出中只有一个 div,因为源 XML 中只有一个 Nodes 节点 - 唯一创建 div 的模板是匹配 Nodes 的模板。

要获得您正在寻找的结果,您应该尝试以下方法:

XSLT 1.0

<xsl:template match="/Nodes">
    <root>
        <xsl:for-each select="Node">
            <div id="node_{position()}">
                <xsl:for-each select="Tag">
                    <xsl:value-of select="." />
                </xsl:for-each>
            </div>
        </xsl:for-each>
    </root>
</xsl:template>

结果

<root>
   <div id="node_1">ab</div>
   <div id="node_2">c</div>
</root>

XSLT 2.0

<xsl:template match="/Nodes">
    <root>
        <xsl:for-each select="Node">
            <div id="node_{position()}">
                <xsl:value-of select="Tag" />
            </div>
        </xsl:for-each>
    </root>
</xsl:template>

结果

<root>
   <div id="node_1">a b</div>
   <div id="node_2">c</div>
</root>

【讨论】:

  • 感谢您的快速答复。但我现在会得到三个 div。单个 div 中的每个标记值 :)。我做错了什么?
  • @RobinAegerter 首先:告诉我们您正在使用哪个处理器,以便我们知道这是 XSLT 1.0 还是 2.0。接下来,编辑您的问题并使用完整的样式表显示 minimal reproducible example,而不仅仅是 sn-p。
  • 我指的是您的 XSLT 处理器,而不是您的 CPU。这可能是 Saxon 或 Xalan 或 libxslt 或 MSXML 或该类别中的其他东西。 IOW,运行 XSL 转换的应用程序。
  • 对不起。那是 libxslt 1.0
  • libxslt 是 XSLT 1.0。我仍然没有看到完整的样式表。看看xsltransform.net/pNvs5x9 看看我得到的结果。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2011-09-24
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多