Вот краткое и простое (без условий, без переменных, нет xsl:for-each
) решение с использованием ключей :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kCI-ByIdImpl" match="ChannelInfo"
use="concat(@ChannelId,
'+', @IsImplemented,
'+', ../../@Model)"/>
<xsl:template match="/*">
<xsl:copy-of select=
"Installation/*/*
/InstalledChannel
[key('kCI-ByIdImpl',
concat(@ChannelId, '+true',
'+', ../../@Model)
)
]"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленномуФрагмент XML (обернутый в один верхний элемент, чтобы сделать правильно сформированный документ XML):
<t>
<DeviceTypes>
<DeviceInfo Model="51473">
<Channels>
<ChannelInfo ChannelId="1" IsImplemented="false" SampRateHardware="448" />
<ChannelInfo ChannelId="2" IsImplemented="true" SampRateHardware="224" />
</Channels>
</DeviceInfo>
<DeviceInfo Model="51474">
<Channels>
<ChannelInfo ChannelId="1" IsImplemented="true" SampRateHardware="448" />
<ChannelInfo ChannelId="2" IsImplemented="true" SampRateHardware="224" />
</Channels>
</DeviceInfo>
</DeviceTypes>
<Installation>
<InstalledDevice Serial="597657" Model="51473">
<Channels>
<InstalledChannel ChannelId="1" Name="foo" />
<InstalledChannel ChannelId="2" Name="bar" />
</Channels>
</InstalledDevice>
</Installation>
</t>
только 1016 * требуемый элемент обрабатывается (в этомрегистр просто копируется на выход):
<InstalledChannel ChannelId="2" Name="bar"/>
Пояснение : правильное использование составного ключа.