XSLT:适合每个div的孩子,

时间:2018-10-31 08:03:21

标签: html xml xslt foreach transformation

我从很短的时间开始使用XSL,因此必须使用部分child标记创建多个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等于2的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>

1 个答案:

答案 0 :(得分:0)

  

但是我总是得到2 b并带有b c。

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

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

在XSLT 1.0中,以及:

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

在XSLT 2.0中。

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

要获得所需的结果,您应该尝试类似的操作:

XSLT 1.0

Nodes

结果

<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>

XSLT 2.0

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

结果

<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>