在輸入文檔中有多個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