XSLT: для каждого div с частью childs - PullRequest
0 голосов
/ 31 октября 2018

Я делаю 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>

Но я всегда получаю два div с a b c. Вместо этого первый с b, а другой с c. Нужно ли перечислять теги или что-то подобное?

EDIT:

<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 голосов
/ 31 октября 2018

Но я всегда получаю два div с 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, - это тот, который соответствует 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>
...