Заполнение XSL до самой длинной длины поля

У меня есть XSL-файл, в котором есть цикл for-each, и я использую процессор EXSLT, чтобы дать некоторые дополнительные функции (а именно заполнение строк).

то, что я хочу сделать, это заполнить все поля, чтобы они были длиной самой длинной записи для этого поля. Например, чтобы каждое имя было длиннее самого длинного имени, а затем для каждого номера записи добавлялось столько же, сколько самого длинного номера записи.

Надеюсь, я все объяснил.

Заранее спасибо.

3 ответа

Решение
<xsl:variable name="maxLength">
  <xsl:for-each select="name">
    <xsl:sort select="string-length(.)" data-type="number" />
    <xsl:if test="postion() = last()">
      <xsl:value-of select="string-length(.)" />
    </xsl:if>
  </xsl:for-each>
</xsl:variable>

Просто для удовольствия, эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="vMaxLengthIds">
        <xsl:for-each select="/table/tr[1]/*">
            <xsl:variable name="vPosition" select="position()"/>
            <xsl:for-each select="/table/tr/*[$vPosition]">
                <xsl:sort select="string-length(.)" data-type="number" />
                <xsl:if test="position() = last()">
                    <xsl:value-of select="concat('|',generate-id(),'|')" />
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:variable>
    <xsl:variable name="vMaxLength"
                  select="/table/tr/*[contains(
                                         $vMaxLengthIds,
                                         concat('|',generate-id(),'|'))]"/>
    <xsl:variable name="vPaddingMask"
                  select="'                                                '"/>
    <xsl:template match="tr">
        <xsl:apply-templates/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>
    <xsl:template match="td">
        <xsl:apply-templates/>
        <xsl:text> | </xsl:text>
    </xsl:template>
    <xsl:template match="th">
        <xsl:apply-templates/>
        <xsl:text> + </xsl:text>
    </xsl:template>
    <xsl:template match="tr/*/text()">
        <xsl:variable name="vPosition"
                      select="count(../preceding-sibling::*)"/>
        <xsl:value-of
             select="concat(
                        .,
                        substring(
                           $vPaddingMask,
                           1,
                           string-length(
                              $vMaxLength[count(preceding-sibling::*)
                                          = $vPosition])
                           - string-length()))"/>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<table>
    <tr>
        <th>Day</th>
        <th>Month</th>
        <th>Year</th>
    </tr>
    <tr>
        <td>1</td>
        <td>January</td>
        <td>2011</td>
    </tr>
    <tr>
        <td>31</td>
        <td>June</td>
        <td>2011</td>
    </tr>
    <tr>
        <td>11</td>
        <td>February</td>
        <td>2011</td>
    </tr>
</table>

Выход:

Day + Month    + Year + 
1   | January  | 2011 | 
31  | June     | 2011 | 
11  | February | 2011 | 

С C# вы можете перейти на процессор XSLT 2.0, такой как Saxon 9 или XQSharp, а затем вы можете легко найти максимальную длину ваших предметов и использовать функцию, такую ​​как http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html чтобы дополнить их. Если вы хотите сделать это с XSLT 1.0 и EXSLT, используйте http://www.exslt.org/math/functions/max/index.html чтобы найти максимум и использовать решение в http://www.dpawson.co.uk/xsl/sect2/padding.html to pad.

Другие вопросы по тегам