1

XML ファイルをタブ区切りファイルに変換する XSLT ファイルがあります。ファイルに列ヘッダーも追加しました。

XSLT を使用してヘッダーを列に並べて取得することは可能ですか?

ここに私のXSLTファイルがあります:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="wdexample.com" version="1.0">
   <xsl:output method="text" encoding="utf-8" media-type="text/plain" />
   <xsl:strip-space elements="*" />
   <xsl:variable name="newline" select="'&#xA;'" />
   <xsl:variable name="tab" select="'&#x9;'" />
   <xsl:template match="/">
      FAO
      <xsl:value-of select="$tab" />
      FAO_REFERENCE_ID
      <xsl:value-of select="$tab" />
      FAO_TYPE
      <xsl:value-of select="$tab" />
      COMPANY_OF_FAO_DESCRIPTOR
      <xsl:value-of select="$tab" />
      COMPANY_OF_FAO_Custom_Worktag_1_ID
      <xsl:value-of select="$newline" />
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
         <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, ''), 1)" />
         <xsl:value-of select="$tab" />
         <xsl:value-of select="substring(concat(wd:COMPANY_TYPE, ''), 1)" />
         <xsl:value-of select="$tab" />
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

入力 XML は次のとおりです。XML ファイルでは、各 Report_Entry ノードの値が常に存在するとは限りません。

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="wdexample.com">
    <wd:Report_Entry>
        <wd:FAO>testFAO</wd:FAO>
        <wd:FAO_REFERENCE_ID>testRefID</wd:FAO_REFERENCE_ID>
        <wd:FAO_TYPE>testType</wd:FAO_TYPE>
        <wd:COMPANY>testCompany</wd:COMPANY>
        <wd:COMPANY_TYPE>testCompanyType</wd:COMPANY_TYPE>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:FAO>testFAO</wd:FAO>
        <wd:FAO_REFERENCE_ID>testRefID<</wd:FAO_REFERENCE_ID>
        <wd:FAO_TYPE></wd:FAO_TYPE>
        <wd:COMPANY></wd:COMPANY>
        <wd:COMPANY_TYPE>testCompanyType</wd:COMPANY_TYPE>
    </wd:Report_Entry>
    ...
</wd:Report_Data>

レポート エントリ ノードが複数回繰り返されます。ご参考までsubstring(concat())に、将来列を埋める必要がある場合に備えて、そこに関数があります。

列に値がない場合に備えて、パディングを使用して列にその列タイトルと同じ幅を与えることを検討しています。それを行うより良い方法はありますか?

私の質問の要約: 1) 列ヘッダーを列と並べることは可能ですか? 2)列とヘッダーを並べて並べるより良い方法はありますか?

4

2 に答える 2

2

〜いいえ。文字単位のタブ サイズは標準ではありません。

すべてのデータに一貫性があり、サイズが (あまり) 変わらないように見えます。そうしないと、データとヘッダーの間で現在発生しているのと同じように、異なる行の列間で同じ位置の不一致が発生します。

結果の使用目的は何ですか? 解析されますか (特定のセパレーターと構造が必要です)、または印刷されますか (見栄えがよく、列が整列されている必要があります)。

ファイルをきれいに見せたい場合は、以下のような方法で実現される固定長のレコード ファイルをお勧めします。

<xsl:template match="/" name="sp-padding">
    <xsl:param name="count">0</xsl:param>
    <xsl:if test="$count > 0">
        <xsl:text>&#160;</xsl:text>
        <xsl:call-template name="sp-padding">
            <xsl:with-param name="count" select="$count - 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

<xsl:for-each select="nodesToBeConvertedToRow">
    <!-- Col nr:  1 Length: 10-->
    <xsl:call-template name="sp-padding">
        <xsl:with-param name="count" select="10"/>
    </xsl:call-template>
    <!-- Col nr:  2 Length:  3-->
    <xsl:value-of select="nodeWithText"/>
    <xsl:call-template name="sp-padding">
        <xsl:with-param name="count" select="3 - string-length(nodeWithText)"/>
    </xsl:call-template>
    ...
    <xsl:text>&#10;</xsl:text>
</xsl:for-each>

フィールド データ長は、割り当てられたレコード サイズよりも小さくする必要があり、その他の制限がいくつかあります。ただし、すべてのレコード長が対応するスキーマ フィールド サイズよりも大きいため、私の場合はうまくいきました。

于 2013-11-06T20:09:09.840 に答える