我假设你要输出一个唯一的ID一Foo
元素在输入每个不同FooName
。为此,您可以使用Muenchian method:
首先,您将构建一个xsl:key
,使用它您可以通过其内容快速检索FooName
元素。
<xsl:key name="FooNames" match="FooName" use="."/>
使用这个键,你就可以只处理每FooName的第一个实例,从而得到一个不同的列表。在这里,您可以使用generate-id()
函数来比较节点的身份。
<xsl:apply-templates select="//FooName
[generate-id() =
generate-id(key('FooNames', .)[1])]"/>
为了生成标识符,如果你不在乎生成的标识符可以从运行变化来运行,你可以再次使用generate-id()
功能。
全部放在一起:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="FooNames" match="FooName" use="."/>
<xsl:template match="/">
<Out>
<Foos>
<xsl:apply-templates select="//FooName[generate-id() =
generate-id(key('FooNames', .)[1])]"/>
</Foos>
<Bars>
<xsl:apply-templates select="//Input"/>
</Bars>
</Out>
</xsl:template>
<xsl:template match="FooName">
<Foo>
<Id><xsl:value-of select="generate-id()"/></Id>
<Name><xsl:value-of select="."/></Name>
</Foo>
</xsl:template>
<xsl:template match="Input">
<Bar>
<Id><xsl:value-of select="BarId"/></Id>
<Name><xsl:value-of select="BarName"/></Name>
<FooId>
<xsl:value-of select="generate-id(key('FooNames', FooName)[1])"/>
</FooId>
</Bar>
</xsl:template>
</xsl:stylesheet>
用以下示例输入:
<Inputs>
<Input>
<BarId>123</BarId>
<BarName>myname</BarName>
<FooName>dummy</FooName>
</Input>
<Input>
<BarId>124</BarId>
<BarName>anothername</BarName>
<FooName>dummy</FooName>
</Input>
<Input>
<BarId>125</BarId>
<BarName>yetanothername</BarName>
<FooName>dummy-two</FooName>
</Input>
</Inputs>
它将产生输出:
<Out>
<Foos>
<Foo>
<Id>id213296</Id>
<Name>dummy</Name>
</Foo>
<Foo>
<Id>id214097</Id>
<Name>dummy-two</Name>
</Foo>
</Foos>
<Bars>
<Bar>
<Id>123</Id>
<Name>myname</Name>
<FooId>id213296</FooId>
</Bar>
<Bar>
<Id>124</Id>
<Name>anothername</Name>
<FooId>id213296</FooId>
</Bar>
<Bar>
<Id>125</Id>
<Name>yetanothername</Name>
<FooId>id214097</FooId>
</Bar>
</Bars>
</Out>
我认为你是需要更多的信息来提供一些有用的东西。写一些能够提供你想要的东西并且给你想要的东西很容易,但是它会留下问题,是否有多个输入,多个foos,多个条。 FooId的重要性是什么?为什么它是一个元素而不是一个属性?等 – Woody 2012-07-19 10:24:58