的xml:
<mode>1</mode>
<mode>2</mode>
<mode>3</mode>
<mode>4</mode>
<mode>5</mode>
<mode>6</mode>
<mode>7</mode>
<mode>8</mode>
<mode>9</mode>
<mode>10</mode>
<mode>11</mode>
<mode>12</mode>
我需要将它分开(例如4):
XSLT:
<xsl:variable name="vNodes" select="mode"/>
<xsl:variable name="vNumParts" select="4"/>
<xsl:variable name="vNumCols" select="ceiling(count($vNodes) div $vNumParts)"/>
<xsl:for-each select="$vNodes[position() mod $vNumCols = 1]">
<xsl:variable name="vCurPos" select="(position()-1)*$vNumCols +1"/>
<ul>
<xsl:for-each select="$vNodes[position() >= $vCurPos and not(position() > $vCurPos + $vNumCols -1)]">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:for-each>
此代码由Dimitre Novatchev撰写 - 伟大的编码员))
但是对于节点数少于部件数量(例如我有2 modes
),此代码不起作用 - 它不输出任何内容。
如何升级该案例(没有choose
构建)?
答案 0 :(得分:2)
虽然如果节点数小于部件数量,问题定义不正确,这里是我猜测的转换产生OP最可能想要的输出(他为什么不指定这种行为?):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/t">
<t>
<xsl:variable name="vNodes" select="mode"/>
<xsl:variable name="vNumParts" select="4"/>
<xsl:variable name="vNumCols" select="ceiling(count($vNodes) div $vNumParts)"/>
<xsl:variable name="vrealNum">
<xsl:choose>
<xsl:when test="$vNumCols >1">
<xsl:value-of select="$vNumCols"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count($vNodes)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:for-each select="$vNodes[position() mod $vrealNum = 1]">
<xsl:variable name="vCurPos" select="(position()-1)*$vrealNum +1"/>
<ul>
<xsl:for-each select="$vNodes[position() >= $vCurPos and not(position() > $vCurPos + $vrealNum -1)]">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:for-each>
</t>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(他甚至无法提供格式良好的XML文档!):
<t>
<mode>1</mode>
<mode>2</mode>
</t>
输出是我猜测 OP想要的......
<t>
<ul>
<li>1</li>
<li>2</li>
</ul>
</t>
答案 1 :(得分:0)
但是节点数少于 零件数量(例如我有2个 模式)这段代码不起作用 - 它 没有输出。
实际上,代码正常运行。
每当部件数量大于节点数量时,问题就无法解决:“将2个节点分成4个相同数量的部件” - 唯一的解决方案是每个part包含0个节点。
现在你正在解决一个新的,不同的问题,难怪不同问题的解决方案对这个新问题不起作用。
要走的路是正确地制定新问题并提出问题。然后很多人会很乐意回答。