从XSL输出中删除空行

时间:2013-11-05 16:45:45

标签: xml xslt tab-delimited

我有一个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>&#x09;</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>

有关如何改善这一点的任何提示? 我使用变量作为选项卡,我也会使用换行变量,但这只会添加一个额外的空行。

1 个答案:

答案 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。并且concatsubstring(..., 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="'&#x0A;'" />
    <xsl:variable name="tab" select="'&#x09;'" />

    <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指令的硬编码序列来执行更具声明性的操作,如果没有看到输入的示例,则很难更具体