我有一个 XSL 文件,其中有一个 for-each 循环,我正在使用 EXSLT 处理器来提供一些附加功能(即字符串填充)。
我想要做的是填充所有字段,以便它们是该字段最长记录的长度。例如,将每个名称与最长的名称一样长,然后将每个记录号填充为最长的记录号。
希望我已经解释清楚了。
提前致谢。
<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>
</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#,您可以迁移到 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。