(1)为什么Option1(模板)产生空格(主要是btw rec1& 5)而Option2(ForEach)不产生空格?
(2)如果可能,如何编写Option1来删除生成的空格?
假设:使用XSLT v1。,XMLPad / Stylus进行测试,MSXML4
处理更大,更复杂的XML输入文件(混合元素/属性)和多个“类型”选择标准,以创建多个TSV输出文件。许多引用似乎表明使用模板作为首选方法。使用匹配当前将太多空格推送到消息队列。
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="'	'" />
<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>
输出 - 选项1模板(无法发布图片,...是空格)
...事件日期......
自行车.... 2012-02-05 ............
自行车.... 2012-02-09。
输出 - Opt2 ForEach
...事件日期.....
自行车.... 2012-02-05
自行车.... 2012-02-09
答案 0 :(得分:1)
你想要这个:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vTab" select="'	'" />
<xsl:variable name="vNL" select="' '" />
<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
答案 1 :(得分:1)
我尝试过不同的编辑器(Architag XRay Xml编辑器,它使用MSXML)并使其工作我必须使用CR / LF字符。我相信Dimitre的回答是正确的。 这是我的修改:
<!-- 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>