我有一个xsl文件,它接受xml并生成制表符分隔文件。
我的问题是每行后都有一个空行。
如何删除每行实际值后的空白行?
我尝试使用<xsl:strip-space elements="*"/>
,但这不起作用。
在所有值之前我还有2个空行,在所有值之后还有2个空行。
这是我的xsl文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc">
<xsl:output method="text" encoding="utf-8" media-type="text/plain" />
<!-- <xsl:strip-space elements="*"/> -->
<xsl:variable name="newline"><xsl:text>
</xsl:text></xsl:variable>
<xsl:variable name="tab"><xsl:text>	</xsl:text></xsl:variable>
<xsl:template match="/wd:Report_Entry" xml:space="preserve">
<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/wd:COMPANY_OF_FAO/@wd:Descriptor, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COMPANY/wd:COMPANY_OF_FAO/wd:ID[@wd:type='WID'], ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COMPANY/wd:COMPANY_OF_FAO/wd:ID[@wd:type='Custom_Worktag_1_ID'], ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COMPANY/wd:COMPANY_OF_FAO_REFERENCE_ID, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COMPANY/wd:COMPANY_OF_FAO_TYPE, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COST_CENTER/wd:COST_CENTER, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COST_CENTER/wd:COST_CENTER_REFERENCE_ID, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:COST_CENTER/wd:COST_CENTER_TYPE, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:FUND/wd:FUND, ''), 1)" /><xsl:value-of select="$tab"/><xsl:value-of select="substring(concat(wd:FUND/wd:FUND_REFERENCE_ID, ''), 1)" /><xsl:value-of select="$tab"/>
</xsl:template>
</xsl:stylesheet>
有关如何改善这一点的任何提示? 我使用变量作为选项卡,我也会使用换行变量,但这只会添加一个额外的空行。
答案 0 :(得分:3)
strip-space
仅影响从输入XML文档中读取的空白文本节点。问题很可能是您已将xml:space="preserve"
放在样式表中的<xsl:template match="/wd:Report_Entry">
上。样式表本身通常会忽略仅限空格的文本节点(除了<xsl:text>
内),但是通过添加xml:space="preserve"
,您已告诉它保留开头<xsl:template>
标记之间的换行符。第一个<xsl:value-of>
,以及最后一个value-of
和结束</xsl:template>
之间,因此它们会包含在输出树中。
如果删除xml:space
,那么您也可以更加可读地格式化XSLT。并且concat
和substring(..., 1)
调用是不必要的,请尝试更类似的内容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc">
<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="/wd:Report_Entry">
<xsl:value-of select="wd:FAO" />
<xsl:value-of select="$tab"/>
<xsl:value-of select="substring(wd:FAO_REFERENCE_ID, 1, 8)" />
<xsl:value-of select="$tab"/>
<xsl:value-of select="wd:FAO_TYPE" />
<xsl:value-of select="$tab"/>
<xsl:value-of select="wd:COMPANY/wd:COMPANY_OF_FAO/@wd:Descriptor" />
<xsl:value-of select="$tab"/>
<!-- etc. etc. -->
<xsl:value-of select="wd:FUND/wd:FUND_REFERENCE_ID" />
<xsl:value-of select="$newline"/>
</xsl:template>
</xsl:stylesheet>
或者更简洁:
<xsl:template match="/wd:Report_Entry">
<xsl:value-of select="concat(
wd:FAO, $tab,
substring(wd:FAO_REFERENCE_ID, 1, 8), $tab,
wd:FAO_TYPE, $tab,
wd:COMPANY/wd:COMPANY_OF_FAO/@wd:Descriptor, $tab,
.....
wd:FUND/wd:FUND_REFERENCE_ID, $newline)" />
</xsl:template>
根据输入XML的结构,您可以使用模板而不是value-of
指令的硬编码序列来执行更具声明性的操作,如果没有看到输入的示例,则很难更具体