1

这是xml:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapnode>
    <n>
        <node id="1"/>
        <node id="2"/>
        <node id="3"/>
    </n>
    <n>
        <node id="4"/>
        <node id="5"/>
        <node id="6"/>
        <node id="7"/>
        <node id="8"/>
    </n>
    <n>
        <node id="9"/>
        <node id="10"/>
    </n>
    <n>
        <node id="11"/>
        <node id="12"/>
    </n>
</sitemapnode>

我想让它像:

<div>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <ul>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>
    <ul>
        <li>9</li>
        <li>10</li>
        <li>11</li>
        <li>12</li>
    </ul>
</div>

我无法解决这个问题...

我这样尝试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:variable name="number" select="ceiling(count(/*/*/node) div 3)"/>
    <xsl:template match="*">
        <div>
            <xsl:apply-templates select="/*/*/node[position() mod $number = 1]"/>
        </div>
    </xsl:template>
    <xsl:template match="node">
        <ul>
            <xsl:apply-templates select="self::node|following-sibling::node[position() &lt; $number]" mode="list"/>
        </ul>
    </xsl:template>
    <xsl:template match="node" mode="list">
        <li>
            <xsl:value-of select="@id"/>
        </li>
    </xsl:template>
</xsl:stylesheet>

转换后,结果如下:

    <div>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
    </ul>
    <ul>
        <li>8</li>
    </ul>
    <ul>
        <li>9</li>
        <li>10</li>
    </ul>
    <ul>
        <li>11</li>
        <li>12</li>
    </ul>
</div>

那不是我想要的。我怎样才能使它正确?我正在使用 XSLT 1.0 和 .Net 3.5。

4

1 回答 1

0

试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:variable name="number" select="ceiling(count(/*/*/node) div 3)"/>
    <xsl:template match="*">
        <div>
            <xsl:apply-templates select="(/*/*/node)[position() mod $number = 1]"/>
        </div>
    </xsl:template>
    <xsl:template match="node">
        <ul>
            <xsl:apply-templates select="current() |
                                         following::node[position() &lt; $number]" 
                                 mode="list"/>
        </ul>
    </xsl:template>
    <xsl:template match="node" mode="list">
        <li>
            <xsl:value-of select="@id"/>
        </li>
    </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,结果是:

<div>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>
  <ul>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
  </ul>
  <ul>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
  </ul>
</div>
于 2013-05-22T14:25:56.283 回答