我有一个XSL文件,其中包含for-each循环,我使用EXSLT处理器来提供一些附加功能(即字符串填充)。
我希望能够做的是填充所有字段,以便它们是该字段的最长记录的长度。例如,对于每个名称,只要是最长的名称,然后为每个记录号码填充只要最长的记录号。
希望我已经解释过这个。
提前致谢。
答案 0 :(得分: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>
答案 1 :(得分: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>
</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 |
答案 2 :(得分: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中的解决方案进行填充。