2

xml を取り、タブ区切りファイルを生成する xsl ファイルがあります。

私の問題は、すべての行の後に空白行があることです。

実際の値の各行の後に空白行を削除するにはどうすればよいですか?

使ってみ<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">空白のみのテキスト ノードは通常、スタイルシート自体では無視されますが ( 内を除いて<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="'&#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 に答える