【发布时间】:2015-09-07 11:55:37
【问题描述】:
我正在尝试使用 XSLT 将 XML 文档转换为纯文本表格以供人类使用。我正在使用 xsltproc,它只实现 XSLT 1.0(所以 max 实际上来自 EXSLT)。
我尝试了以下方法,但注释掉的定义失败了,因为 string-length 只返回一个值(first 节点的字符串值的长度),而不是像 @987654324 这样的节点集@想要。
转换:
<?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 |
+----+
为了使右边框对齐,我需要在变量中设置实际的最大值。 (在我的真实示例中,我将有列标题和多个列,但它们不是重现问题所必需的)。
如果它更容易找到解决方案,我可以保证数据值永远不会包含空格。
【问题讨论】: