嵌套XSL循环

时间:2014-05-05 19:24:44

标签: xml xslt xpath

如果我试图实现我想要实现的方式,我需要一个建议:)是错还是不错。 我有一个输入XML,看起来像这样:

<somexml>
<item name="name1" />
<item name="name2" />
<item name="name3" />
<item name="name4" />
<item name="name5" />
<item name="name6" />
<item name="name7" />
<item name="name8" />
<item name="name9" />
</somexml>

我有两个XSL模板。第一个应该应用于第一个<item>,第二个应该应用于按{3}分组的其余<item>,同时考虑到最后一个组可能(或可能不)包含更少超过3个元素。 为了更清楚,我应该得到像

这样的东西
<template1>name1</template1>
<template2>name2, name3, name4</template2>
<template2>name5, name6, name7</template2>
<template2>name8, name9</template2>

主要问题是:是否可以使用纯XSLT / XPath实现这一目标,还是应该回退到后端代码中的项目分组,只是通过不同的XLS模板输出它们? 很抱歉没有发布我的“我尝试了什么” - 它太丑了,我一想到它就永远不会起作用我就摆脱它了。)

1 个答案:

答案 0 :(得分:2)

  

主要问题是:甚至可以使用纯粹的方法实现这一目标   XSLT / XPath的

是的,有可能。但是您请求的输出不是有效的XML:您必须具有根元素。

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/somexml">
    <output>
        <xsl:apply-templates select="item[1]" />
        <xsl:apply-templates select="item[position() > 1][position() mod 3 = 1]" />
    </output>
</xsl:template>

<xsl:template match="item[1]">
    <template1><xsl:value-of select="@name"/></template1>
</xsl:template>

<xsl:template match="item">
    <template2>
        <xsl:value-of select="@name"/>
        <xsl:if test="following-sibling::item[1]">
            <xsl:text>,</xsl:text>
            <xsl:value-of select="following-sibling::item[1]/@name"/>
        </xsl:if>
        <xsl:if test="following-sibling::item[2]">
            <xsl:text>,</xsl:text>
            <xsl:value-of select="following-sibling::item[2]/@name"/>
        </xsl:if>
    </template2>
</xsl:template>

</xsl:stylesheet>

另请注意,在此上下文中命名结果元素“template”相当混乱。