2

我有一个 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>

关于如何使它变得更好的任何提示?我正在为选项卡使用一个变量,我也会使用换行变量,但这只会添加一个额外的空白行。

4

1 回答 1

3

strip-space唯一影响从输入 XML 文档读取的空白文本节点。问题很可能是您xml:space="preserve"<xsl:template match="/wd:Report_Entry">样式表中添加了 。仅空白文本节点通常在样式表本身中被忽略(除了 within <xsl:text>),但是通过添加,xml:space="preserve"您已经告诉它保留开始<xsl:template>标记和 first<xsl:value-of>之间以及 lastvalue-of和结束标记之间的换行符</xsl:template>,因此他们得到包含在输出树中。

如果您删除了,xml:space那么您还可以格式化您的 XSLT,而更具可读性。并且concatandsubstring(..., 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指令序列来做一些更具声明性的事情,如果没有看到输入示例,很难更具体。

于 2013-11-05T17:18:49.077 回答