我希望将XML转换为组合某些元素的文本,但要避免输出中的重复。 XML就是这样的:
<A>
<B>
<param1>value0</param1>
<param2>value1</param2>
</B>
<B>
<param1>value2</param1>
<param2>value3</param2>
</B>
<C>
<param3>valueC1</param3>
<D>
<param4>value0</param4>
<param5>value4</param5>
</D>
<D>
<param4>value0</param4>
<param5>value5</param5>
</D>
<D>
<param4>value2</param4>
<param5>value6</param5>
</D>
</C>
<C>
<param3>valueC2</param3>
<D>
<param4>value0</param4>
<param5>value5</param5>
</D>
</C>
</A>
输出:
OBJECT: param1=value0, param2=value1, param3=valueC1, param4=value0;
OBJECT: param1=value2, param2=value3, param3=valueC1, param4=value2;
OBJECT: param1=value0, param2=value1, param3=valueC2, param4=value0;
注意:
我找了一些类似的问题,但我在同一个案例中找不到任何问题。
我猜它可以通过使用键来完成,但它太复杂了。
谢谢!
此致 ALE。
PS:对不起我的英文。
答案 0 :(得分:3)
鉴于您未在输出中使用param5
,似乎可以将问题简化为
param1
与所包含的任何的param4
匹配这是使用模板实现这一目标的一种方法。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:key name="BbyParam1" match="B" use="param1" />
<xsl:template match="/">
<xsl:apply-templates select="A/C" />
</xsl:template>
<xsl:template match="C">
<xsl:apply-templates select="key('BbyParam1', D/param4)">
<xsl:with-param name="currentC" select="." />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="B">
<xsl:param name="currentC" />
<xsl:text>OBJECT: param1=</xsl:text>
<xsl:value-of select="param1" />
<xsl:text>, param2=</xsl:text>
<xsl:value-of select="param2" />
<xsl:text>, param3=</xsl:text>
<xsl:value-of select="$currentC/param3" />
<xsl:text>, param4=</xsl:text>
<xsl:value-of select="param1" />
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
“查找所有不同的 B元素,其param1
与所包含的任何的param4
匹配”实际上非常简单,因为事实上,当你将一个节点集作为第二个参数传递给key
函数时,它正是这样做的 - 它返回所有节点的集合,其键值是任何的字符串值。参数节点集中的节点和返回的节点集(作为集合)保证不包含重复项。
答案 1 :(得分:0)
这应该可以解决问题:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:key name="kB" match="B" use="param1" />
<xsl:key name="kD" match="D"
use="concat(param4, '+', generate-id(..))"/>
<xsl:template match="/">
<xsl:apply-templates select="A/C" />
</xsl:template>
<xsl:template match="C">
<xsl:apply-templates select="D[key('kB', param4) and
generate-id() =
generate-id(key('kD',
concat(
param4,
'+',
generate-id(..)
)
)[1])]" />
</xsl:template>
<xsl:template match="D">
<xsl:value-of
select="concat('OBJECT: param1=',
key('kB', param4)/param1,
', param2=',
key('kB', param4)/param2,
', param3=',
../param3,
', param4=',
param4,
'
')"/>
</xsl:template>
</xsl:stylesheet>
在样品上运行时的输出:
OBJECT: param1=value0, param2=value1, param3=valueC1, param4=value0
OBJECT: param1=value2, param2=value3, param3=valueC1, param4=value2
OBJECT: param1=value0, param2=value1, param3=valueC2, param4=value0