Ответ Obalix может не сработать, если во входном документе несколько элементов paramList
.Я предполагаю, что это может заинтересовать автора, если в документе описан программный интерфейс, в котором есть несколько процедур с 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
.
<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>