XSL输出超过预期

时间:2011-11-15 12:35:10

标签: xslt xpath

我是XSLT和XPath的新手,并且已经在这个问题上一直撞到了墙上一段时间。

我有以下XML:

<reply>
    <multi-results>
        <multi-item>
            <name>node1</name>
            <information>
                <block>
                    <slot>A</slot>
                    <state>Online</state>
                    <colour>purple</colour>
                </block>
                <block>
                    <slot>B</slot>
                    <state>Online</state>
                    <colour>yellow</colour>
                </block>
                <block>
                    <slot>C</slot>
                    <state>Online</state>
                    <colour>red</colour>
                </block>
                <block>
                    <slot>D</slot>
                    <state>Online</state>
                    <colour>blue</colour>
                </block>
            </information>
        </multi-item>
    </multi-results>
    <address>
        <label>this is an arbitrary bit of text included for this example</label>
    </address>
</reply>

每个文件都有可变数量的“块”条目。

我想“CSV”数据,我正在使用以下XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="*/text()[normalize-space()]">
        <xsl:value-of select="normalize-space()"/>
    </xsl:template>
    <xsl:template match="*/text()[not(normalize-space())]" />
    <xsl:template match="block">
        <xsl:value-of select="slot"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="state"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="colour"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

输出:

node1A|Online|purple
B|Online|yellow
C|Online|red
D|Online|blue
this is an arbitrary bit of text included for this example

但是,输出包括“名称”和“标签”......

我只想要在XSL中明确要求的内容:

A|Online|purple
B|Online|yellow
C|Online|red
D|Online|blue

我不明白为什么。有人可以解释一下吗?

此外,可能有多个“名称”元素,每个元素都有自己的“块”元素数。

非常感谢提前

2 个答案:

答案 0 :(得分:3)

正在使用默认模板规则处理<block>之外的元素。为防止这种情况,您需要添加

<xsl:template match="/">
  <xsl:apply-templates select="block"/>
</xsl:template>

然后您不需要与文本节点匹配的模板规则,因为您从不将模板应用于文本节点。

答案 1 :(得分:2)

只需从第一个xsl:template中删除xsl:value-of。你会得到“名称”和“标签”内容:它需要任何文本节点并输出其内容。此外,您不需要检查文本节点上的条件,为它们留下一个xsl:template,其中包含空体:

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