Заполнение 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>
</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.