【问题标题】:Remove Blank Lines from XSL output从 XSL 输出中删除空行
【发布时间】:2013-11-05 16:45:44
【问题描述】:

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

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

【问题讨论】:

    标签: xml xslt csv


    【解决方案1】:

    strip-space 仅影响从输入 XML 文档读取的空白文本节点。问题很可能是您将xml:space="preserve" 放在样式表中的&lt;xsl:template match="/wd:Report_Entry"&gt; 上。仅空白文本节点通常在样式表本身中被忽略(除了在&lt;xsl:text&gt; 内),但通过添加xml:space="preserve",您已经告诉它保留开始&lt;xsl:template&gt; 标记和第一个&lt;xsl:value-of&gt; 之间的换行符,在最后一个value-of 和结束&lt;/xsl:template&gt; 之间,因此它们被包含在输出树中。

    如果您删除了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 指令序列来做一些更具声明性的事情,如果没有看到输入示例,很难更具体。

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      相关资源
      最近更新 更多