1

(1) 为什么 Option1 (Template) 会产生空白 (主要是 btw rec1 & 5) 而 Option2 (ForEach) 不会?
(2) 如果可能,我如何编码 Option1 以删除生成的空格?
假设:使用 XSLT v1.、用于测试的 XMLPad/Stylus、MSXML4。
处理具有多个“类型”选择标准的更大、更复杂的 XML 输入文件(元素/属性的混合),以创建多个 TSV 输出文件。许多参考资料似乎表明使用模板作为首选方法。当前,使用 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

我尝试了不同的编辑器(Architag XRay Xml 编辑器,它使用 MSXML),为了让它工作,我不得不使用 CR/LF 字符。我相信 Dimitre 的回答是正确的。这是我的修改:

<!-- 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 回答