Если вы действительно хотите использовать contains
, вы должны определить переменную следующим образом:
<xsl:variable name="SubelementsToFilter">
<xsl:text>;</xsl:text>
<xsl:value-of select="//Subelement[@RelevantForFiltering='true']/@ID" separator=";"/>
<xsl:text>;</xsl:text>
</xsl:variable>
И тогда совпадение шаблона станет следующим:
<xsl:template match="Element/UseableSubelements/SubelementReference[contains($SubelementsToFilter, concat(';', @Target, ';'))]"/>
Это обойдетсяпроблема A-SubElem01, AB
, содержащая SumElem01
.
Однако, вам не нужно contains
здесь.Вы можете просто определить переменную следующим образом:
<xsl:variable name="SubelementsToFilter" select="//Subelement[@RelevantForFiltering='true']/@ID" />
И тогда совпадение с вашим шаблоном станет следующим:
<xsl:template match="Element/UseableSubelements/SubelementReference[$SubelementsToFilter = @Target]"/>
Однако вы также можете достичь того же результата с помощью ключа.Определите ключ для поиска Subelement
следующим образом;
<xsl:key name="Subelements" match="Subelement" use="@ID" />
И тогда совпадение шаблона станет таким:
<xsl:template match="Element/UseableSubelements/SubelementReference[key('Subelements', @Target)[@RelevantForFiltering='true']]"/>
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" omit-xml-declaration="no"/>
<xsl:key name="Subelements" match="Subelement" use="@ID" />
<!-- Identity transformation -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Remove Subelements -> working fine -->
<xsl:template match="Subelement[@RelevantForFiltering='true']"/>
<!-- Remove SubelementReferences -> too many items are removed -->
<xsl:template match="Element/UseableSubelements/SubelementReference[key('Subelements', @Target)[@RelevantForFiltering='true']]"/>
</xsl:stylesheet>