Автоподбор не работает в ячейках со строками. Попробуйте заменить Column-line в вашем примере следующим кодом:
<xsl:for-each select="/*/*[1]/*">
<Column>
<xsl:variable name="columnNum" select="position()"/>
<xsl:for-each select="/*/*/*[position()=$columnNum]">
<xsl:sort select="concat(string-length(string-length(.)),string-length(.))" order="descending"/>
<xsl:if test="position()=1">
<xsl:if test="string-length(.) < 201">
<xsl:attribute name="ss:Width">
<xsl:value-of select="5.25 * (string-length(.)+2)"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="string-length(.) > 200">
<xsl:attribute name="ss:Width">
<xsl:value-of select="1000"/>
</xsl:attribute>
</xsl:if>
</xsl:if>
<xsl:if test = "local-name() = 'Sorteer'">
<xsl:attribute name="ss:Width">
<xsl:value-of select="0"/>
</xsl:attribute>
</xsl:if>
</xsl:for-each>
</Column>
</xsl:for-each>
Объяснение: он сортирует по длине строки (сначала самая длинная строка), берет первую строку отсортированных строк, берет длину этой строки * 5,25, и вы получите разумную автоподгонку.
Сортировочная линия:
<xsl:sort select="concat(string-length(string-length(.)),string-length(.))" order="descending"/>
объяснение: если вы просто сортируете по длине, например
<xsl:sort select="string-length(.)" order="descending"/>
поскольку длины обрабатываются как строки, 2 идет после 10, что вам не нужно. Таким образом, вы должны добавить длины влево, чтобы отсортировать их правильно (потому что 002 предшествует 010). Однако, поскольку я не смог найти эту функцию заполнения, я решил ее, соединив длину длины с длиной. Строка длиной 100 будет переведена в 3100 (первая цифра — это длина длины), вы увидите, что решение всегда будет правильно сортировать строки. например: 2 будет "12", а 10 будет "210", поэтому это будет правильно отсортировано по строкам. Проблемы возникнут только тогда, когда длина > 9 вызовет проблемы, но строки длиной 100000000 не могут быть обработаны Excel.
Эксплантация
<xsl:if test="string-length(.) < 201">
<xsl:attribute name="ss:Width">
<xsl:value-of select="5.25 * (string-length(.)+2)"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="string-length(.) > 200">
<xsl:attribute name="ss:Width">
<xsl:value-of select="1000"/>
</xsl:attribute>
</xsl:if>
Я хотел максимизировать длину строки примерно до 200, но не смог заставить работать функцию Min, например
<xsl:value-of select="5.25 * Min((string-length(.)+2),200)"/>
Поэтому мне пришлось сделать это грязным способом.
Я надеюсь, что вы можете автофит теперь!
person
Mathijs Beentjes
schedule
25.09.2014