我假设您想为输入中Foo
的每个不同输出一个具有唯一 ID 的元素FooName
。为此,您可以使用Muenchian 方法:
首先,您将构建一个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>