我有一个XSLT文件,它将XML文件转换为制表符分隔文件。我还在文件中添加了列标题。
是否有可能以某种方式使用XSLT使列与列对齐?
这是我的XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="wdexample.com" version="1.0">
<xsl:output method="text" encoding="utf-8" media-type="text/plain" />
<xsl:strip-space elements="*" />
<xsl:variable name="newline" select="'
'" />
<xsl:variable name="tab" select="'	'" />
<xsl:template match="/">
FAO
<xsl:value-of select="$tab" />
FAO_REFERENCE_ID
<xsl:value-of select="$tab" />
FAO_TYPE
<xsl:value-of select="$tab" />
COMPANY_OF_FAO_DESCRIPTOR
<xsl:value-of select="$tab" />
COMPANY_OF_FAO_Custom_Worktag_1_ID
<xsl:value-of select="$newline" />
<xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
<xsl:value-of select="substring(concat(wd:FAO, ''), 1)" />
<xsl:value-of select="$tab" />
<xsl:value-of select="substring(concat(wd:FAO_REFERENCE_ID, ''), 1, 8)" />
<xsl:value-of select="$tab" />
<xsl:value-of select="substring(concat(wd:FAO_TYPE, ''), 1)" />
<xsl:value-of select="$tab" />
<xsl:value-of select="substring(concat(wd:COMPANY, ''), 1)" />
<xsl:value-of select="$tab" />
<xsl:value-of select="substring(concat(wd:COMPANY_TYPE, ''), 1)" />
<xsl:value-of select="$tab" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这是输入XML。在XML文件中,每个Report_Entry节点都不会总是有值。
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="wdexample.com">
<wd:Report_Entry>
<wd:FAO>testFAO</wd:FAO>
<wd:FAO_REFERENCE_ID>testRefID</wd:FAO_REFERENCE_ID>
<wd:FAO_TYPE>testType</wd:FAO_TYPE>
<wd:COMPANY>testCompany</wd:COMPANY>
<wd:COMPANY_TYPE>testCompanyType</wd:COMPANY_TYPE>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:FAO>testFAO</wd:FAO>
<wd:FAO_REFERENCE_ID>testRefID<</wd:FAO_REFERENCE_ID>
<wd:FAO_TYPE></wd:FAO_TYPE>
<wd:COMPANY></wd:COMPANY>
<wd:COMPANY_TYPE>testCompanyType</wd:COMPANY_TYPE>
</wd:Report_Entry>
...
</wd:Report_Data>
报告输入节点重复多次。
如果你想知道,我有substring(concat())
函数,以防我将来必须填充列。
我正在考虑使用填充为列提供与列标题相同的宽度,以防列没有值。有没有更好的方法呢?
回顾一下我的问题: 1)是否可以将列标题与列对齐? 2)是否有更好的方法来排列色谱柱和标题以保持一致?
答案 0 :(得分:2)
〜不。标签大小以字符为单位。
看起来您的所有数据都是一致的并且大小不同(很多),否则您在数据和标题之间的不同行的列之间会有相同的定位不一致。
结果的目标用途是什么?它是否会被解析(需要特定的分隔符和结构)或打印(看起来应该很好并且有对齐的列)?
如果你想让文件看起来漂亮,我建议使用固定长度的记录文件,通过以下方式实现。
<xsl:template match="/" name="sp-padding">
<xsl:param name="count">0</xsl:param>
<xsl:if test="$count > 0">
<xsl:text> </xsl:text>
<xsl:call-template name="sp-padding">
<xsl:with-param name="count" select="$count - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:for-each select="nodesToBeConvertedToRow">
<!-- Col nr: 1 Length: 10-->
<xsl:call-template name="sp-padding">
<xsl:with-param name="count" select="10"/>
</xsl:call-template>
<!-- Col nr: 2 Length: 3-->
<xsl:value-of select="nodeWithText"/>
<xsl:call-template name="sp-padding">
<xsl:with-param name="count" select="3 - string-length(nodeWithText)"/>
</xsl:call-template>
...
<xsl:text> </xsl:text>
</xsl:for-each>
字段数据长度需要小于分配的记录大小,并且存在一些其他限制。它适用于我的情况,因为所有记录长度都大于相应的模式字段大小。
答案 1 :(得分:0)
我决定为列标题创建变量,并附加足够的空格,如下所示:
<xsl:variable name="FAO" select="concat('FAO ', '')" />
<xsl:variable name="FAO1" select="concat('FAO REFERENCE ID', '')" />
然后我在每个循环之前在模板中显示列标题。
然后在循环中,我像之前一样输出值,但我使用列标题的长度,如下所示:
<xsl:value-of select="substring(concat(wd:FAO, ' '), 1, string-length($FAO))" /><xsl:value-of select="$tab"/>
<xsl:value-of select="substring(concat(wd:FAO_REFERENCE_ID, ' '), 1, string-length($FAO1))" /><xsl:value-of select="$tab"/>
这有点难看,但在我找到更好的解决方案之前它会起作用。