XSL 填充到最长字段长度

发布于 2024-10-10 22:03:31 字数 186 浏览 6 评论 0 原文

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

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

希望我已经解释清楚了。

提前致谢。

I have an XSL file which has a for-each loop in it and I am using an EXSLT processor to give some added functionality (namely the string padding).

what I want to be able to do is pad out all fields so they are the length of the longest record for that field. For example, for each name to be as long as the longest name, and then for each record number to be padded as long as the longest record number.

Hope I have explained this okay.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

弱骨蛰伏 2024-10-17 22:03:31
<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: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>
雪化雨蝶 2024-10-17 22:03:31

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

<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>
</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 | 

Just for fun, this stylesheet:

<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>
</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>

With this input:

<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>

Output:

Day + Month    + Year + 
1   | January  | 2011 | 
31  | June     | 2011 | 
11  | February | 2011 | 
亚希 2024-10-17 22:03:31

使用 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 进行填充。

With C# you could move to an XSLT 2.0 processor like Saxon 9 or XQSharp and then you can easily find the maximum length of your items and use a function like http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html to pad them.
If you want to do it with XSLT 1.0 and EXSLT then use http://www.exslt.org/math/functions/max/index.html to find the maximum and use a solution in http://www.dpawson.co.uk/xsl/sect2/padding.html to pad.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文