<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="Foo/Bar"></xsl:apply-templates>
</xsl:template>
<xsl:template match="Bar">
<xsl:for-each select="AAA"><xsl:for-each select="BBB"><xsl:value-of select="Label"/>|<xsl:value-of select="Value"/><xsl:text> </xsl:text></xsl:for-each></xsl:for-each>
</xsl:template>
</xsl:stylesheet>
逐行生成输出,没有标签:
SomeLabel|SomeValue
SomeLabel|SomeValue
SomeLabel|SomeValue
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="Foo/Bar"></xsl:apply-templates>
</xsl:template>
<xsl:template match="Bar">
<xsl:for-each select="AAA">
<xsl:for-each select="BBB">
<xsl:value-of select="Label"/>|<xsl:value-of select="Value"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用标签生成输出:
SomeLabel|SomeValue
SomeLabel|SomeValue
SomeLabel|SomeValue
更新 添加这个并不能解决问题:
<xsl:output method="text" indent="no"/>
<xsl:strip-space elements="*"></xsl:strip-space>
这是设计的,但您可以想象XML看起来像这样:
<Foo>
<Bar>
<AAA>
<BBB>
<Label>SomeLabel1</Label>
<Value>SomeValue1</Value>
</BBB>
<BBB>
<Label>SomeLabel2</Label>
<Value>SomeValue2</Value>
</BBB>
<BBB>
<Label>SomeLabel3</Label>
<Value>SomeValue3</Value>
</BBB>
</AAA>
</Bar>
</Foo>
答案 0 :(得分:0)
您可以尝试将所有当前文本节点包装在 xsl:text 中。例如,试试这个
<xsl:for-each select="BBB">
<xsl:value-of select="Label"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="Value"/>
<xsl:text>|</xsl:text>
</xsl:for-each>
或者,您可以使用 concat 函数。
<xsl:for-each select="BBB">
<xsl:value-of select="concat(Label, '|')"/>
<xsl:value-of select="concat(Value, '|')"/>
</xsl:for-each>
如果您愿意,您甚至可以将两个陈述合并为一个
<xsl:for-each select="BBB">
<xsl:value-of select="concat(Label, '|', Value, '|')"/>
</xsl:for-each>
编辑:如果您不想多次输入分隔符|
,则可以使用模板匹配来输出文件。首先,将值替换为 apply-templates ,如此
<xsl:for-each select="BBB">
<xsl:apply-templates select="Label"/>
<xsl:apply-templates select="Value"/>
<xsl:text> </xsl:text>
</xsl:for-each>
然后你会有一个特定的模板来匹配标签,你不需要输出分隔符,另一个更通用的模板匹配任何 BBB <的孩子/ p>
<xsl:template match="BBB/Label" priority="1">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="BBB/*">
<xsl:text>|</xsl:text><xsl:value-of select="." />
</xsl:template>
(此处需要优先级以确保标签与第一个模板匹配,而不是一般模板匹配)。当然,在这种情况下,您也可能无法在标签上执行应用模板,只需执行 xsl:value-of 。
此外,如果字段按照它们出现在XML中的顺序输出,您可以将 for-each 简化为此
<xsl:for-each select="BBB">
<xsl:apply-templates />
<xsl:text> </xsl:text>
</xsl:for-each>