在输入文档中有多个paramList
元素的情况下,Obalix的答案可能不起作用。如果文档描述了一个软件界面,其中有多个过程,每个过程都有一个paramList
,我认为这可能会使海报感兴趣。
下面是一个简单的输入:
<root>
<func name="one">
<paramList>
<param name="y" out="true"/>
<param name="y" in="true"/>
<param name="z" out="true"/>
<param name="x" in="true"/>
</paramList>
</func>
<func name="two">
<paramList>
<param name="z" in="true"/>
</paramList>
</func>
</root>
这是我提出的样式表,建立在Obalix的答案。诀窍是使用包含paramList
元素的ID的本地密钥ID。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:key name="paramsByName" match="param" use="concat(generate-id(..), '/', @name)"/>
<xsl:template match="paramList">
<xsl:copy>
<xsl:variable name="id" select="generate-id(.)"/>
<xsl:for-each select="param[count(. | key('paramsByName', concat($id, '/', @name))[1]) = 1]">
<xsl:copy>
<xsl:copy-of select="key('paramsByName', concat($id, '/', @name))/@*"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
您有没有机会使用XSLT 2.0? – 2010-09-22 14:29:49
是的,使用XSLT 2.0。 – JaysonFix 2010-09-22 14:31:48
好问题(+1)。看到我的答案,对已经发布的解决方案的代码进行了小幅改进。 – 2010-09-22 16:09:30