1

(1) Option1 (テンプレート) が空白 (主に rec1 & 5) を生成するのに、Option2 (ForEach) は生成しないのはなぜですか?
(2) 可能であれば、Option1 をコーディングして結果の空白を削除するにはどうすればよいですか?
前提条件: XSLT v1.、テスト用の XMLPad/Stylus、MSXML4 の使用。
複数の TSV 出力ファイルを作成するために、複数の「タイプ」選択基準を使用して、より大きく、より複雑な XML 入力ファイル (要素/属性の混合) を処理することに取り組んでいます。多くの参考文献は、テンプレートを使用することが好ましい方法であることを示しているようです。現在、match を使用すると、メッセージ キューにプッシュされる空白が多すぎます。

XML:

<main>
    <event>
        <event_type>Bike</event_type>
        <date>2012-02-05</date>
    </event>
    <event>
        <event_type>Run</event_type>
        <date>2012-02-06</date>
    </event>
    <event>
        <event_type>Swim</event_type>
        <date>2012-02-07</date>
    </event>
    <event>
        <event_type>Run</event_type>
        <date>2012-02-08</date>
    </event>
    <event>
        <event_type>Bike</event_type>
        <date>2012-02-09</date>
    </event>
</main>

XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:variable name="tab" select="'&#09;'" />

<xsl:template match="@*|text()"/>

<xsl:template match="/">
<xsl:text/>event<xsl:value-of select="$tab"/>
<xsl:text/>date<xsl:value-of select="$tab"/>
<xsl:apply-templates/>
</xsl:template>

<!-- OPTION1 -->
<xsl:template match="event[event_type='Bike']"><xsl:text>
</xsl:text>
<xsl:value-of select="event_type"/><xsl:value-of select="$tab"/>
<xsl:value-of select="date"/>
</xsl:template>

<!-- OPTION2 -->
<!--<xsl:template match="@*|node()">
<xsl:for-each select="event[event_type='Bike']"><xsl:text>
</xsl:text>
<xsl:value-of select="event_type"/><xsl:value-of select="$tab"/>
<xsl:value-of select="date"/>
</xsl:for-each>
</xsl:template>-->

</xsl:stylesheet>

出力 - Opt1 テンプレート(まだ写真を投稿できません。... は空白です)

イベント...日付......
バイク....2012-02-05........
バイク....2012-02-09.

出力 - Opt2 ForEach

イベント...日付.....
自転車....2012-02-05
自転車....2012-02-09

4

2 に答える 2

1

あなたはこれが欲しい

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

    <xsl:variable name="vTab" select="'&#09;'" />
    <xsl:variable name="vNL" select="'&#10;'" />

    <xsl:template match="@*|text()"/>

    <xsl:template match="/*">
        <xsl:value-of select=
        "concat(' event', $vTab, 'date', $vTab, $vNL)"/>
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="event[event_type='Bike']">
      <xsl:value-of select=
        "concat(' ', event_type, $vTab, date, $vNL)"/>
    </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<main>
    <event>
        <event_type>Bike</event_type>
        <date>2012-02-05</date>
    </event>
    <event>
        <event_type>Run</event_type>
        <date>2012-02-06</date>
    </event>
    <event>
        <event_type>Swim</event_type>
        <date>2012-02-07</date>
    </event>
    <event>
        <event_type>Run</event_type>
        <date>2012-02-08</date>
    </event>
    <event>
        <event_type>Bike</event_type>
        <date>2012-02-09</date>
    </event>
</main>

必要な正しい結果が生成されます。

 event  date    
 Bike   2012-02-05
 Bike   2012-02-09
于 2012-04-27T02:34:34.793 に答える
1

別のエディター (MSXML を使用する Architag XRay Xml エディター) を試しましたが、それを機能させるには CR/LF 文字を使用する必要がありました。ディミトレの答えは正しいと思います。これは私の変更です:

<!-- OPTION1 -->
<xsl:template match="event[event_type='Bike']">
<xsl:text>&#13;&#10;</xsl:text>
<xsl:value-of select="event_type"/><xsl:value-of select="$tab"/>
<xsl:value-of select="date"/>
</xsl:template>
于 2012-04-27T02:46:55.000 に答える