1

我有一个 XSL 文件,其中有一个 for-each 循环,我正在使用 EXSLT 处理器来提供一些附加功能(即字符串填充)。

我想要做的是填充所有字段,以便它们是该字段最长记录的长度。例如,将每个名称与最长的名称一样长,然后将每个记录号填充为最长的记录号。

希望我已经解释清楚了。

提前致谢。

4

3 回答 3

4
<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>
于 2011-01-04T12:36:16.243 回答
2

只是为了好玩,这个样式表:

<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 | 
于 2011-01-04T16:16:21.013 回答
1

使用 C#,您可以迁移到 Saxon 9 或 XQSharp 等 XSLT 2.0 处理器,然后您可以轻松找到项目的最大长度并使用类似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到 pad。

于 2011-01-04T12:35:23.603 回答