Я пытаюсь использовать XSLT, чтобы превратить XML-документ в простые текстовые таблицы для человеческого восприятия. Я использую xsltproc
, который реализует только XSLT 1.0 (так что max
на самом деле из EXSLT).
Я пробовал ниже, но закомментированное определение не работает, потому что string-length
возвращает только одно значение (длину строкового значения первого узла), а не набор узлов, как хочет max
.
Трансформация:
<?xml version="1.0" encoding="utf-8"?>
<!-- vim: set sts=2 sw=2: -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://exslt.org/math" xmlns:str="http://exslt.org/strings">
<xsl:output method="text"/>
<xsl:template match="/root">
<!-- <xsl:variable name="max_a_width" select="math:max(string-length(data/@a))"/> -->
<xsl:variable name="max_a_width" select="string-length(data/@a)"/>
<xsl:text>+-</xsl:text><xsl:value-of select="str:padding($max_a_width, '-')"/><xsl:text>-+ </xsl:text>
<xsl:for-each select="data">
<xsl:text>| </xsl:text><xsl:value-of select="@a"/><xsl:value-of select="str:padding($max_a_width - string-length(@a), ' ')"/><xsl:text> | </xsl:text>
</xsl:for-each>
<xsl:text>+-</xsl:text><xsl:value-of select="str:padding($max_a_width, '-')"/><xsl:text>-+ </xsl:text>
</xsl:template>
</xsl:stylesheet>
Вход:
<?xml version="1.0" encoding="utf-8"?>
<!-- vim: set sts=2 sw=2: -->
<root>
<data a="aa"/>
<data a="aaa"/>
<data a="a"/>
</root>
Выход:
+----+
| aa |
| aaa |
| a |
+----+
Чтобы сделать правильную линию границы, мне нужно иметь фактическое максимальное значение в переменной. (В моем реальном примере у меня будут заголовки столбцов и несколько столбцов, но они не нужны для воспроизведения проблемы).
Если это упростит поиск решения, я могу гарантировать, что значения данных никогда не будут содержать пробелы.