這個樣式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:key name="kOwnersByName" match="owners" use="@name"/>
<xsl:key name="kOsByOwnerAndName" match="os"
use="concat(../@name,'+++',@name)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="owners"/>
<xsl:template match="owners[count(.|key('kOwnersByName',@name)[1])=1]">
<xsl:variable name="vOwner" select="@name"/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="../links/osname/@name">
<xsl:apply-templates
select="key('kOsByOwnerAndName',concat($vOwner,'+++',.))[1]"/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
通過適當的輸入:
<root>
<links>
<osname name="windows xp" links="xyz" />
<osname name="windows 2k" links="xyz" />
</links>
<owners name="microsoft">
<os name="windows xp" />
<os name="windows 2k" />
<os name="windows 2003" />
<os name="windows 7" />
</owners>
<owners name="microsoft">
<os name="windows xp" />
<os name="windows 95" />
<os name="windows 98" />
<os name="windows vista" />
</owners>
</root>
輸出什麼,我認爲是你想要什麼:
<root>
<links>
<osname name="windows xp" links="xyz"></osname>
<osname name="windows 2k" links="xyz"></osname>
</links>
<owners name="microsoft">
<os name="windows xp"></os>
<os name="windows 2k"></os>
</owners>
</root>
請提供XSLT轉換所需的XML輸出。 讓人們猜測不太可能提供您需要的解決方案。 – 2010-09-02 02:50:17