如果我试图实现我想要实现的方式,我需要一个建议:)是错还是不错。 我有一个输入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模板输出它们? 很抱歉没有发布我的“我尝试了什么” - 它太丑了,我一想到它就永远不会起作用我就摆脱它了。)
答案 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”相当混乱。