将节点列表拆分为零件

时间:2010-06-15 11:29:25

标签: xslt split upgrade

的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构建)?

2 个答案:

答案 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个节点。

现在你正在解决一个新的,不同的问题,难怪不同问题的解决方案对这个新问题不起作用

要走的路是正确地制定新问题并提出问题。然后很多人会很乐意回答。