Если вы просто планируете удалить узлы и оставить другие узлы без изменений, всегда полезно начать с шаблона идентификации, так как он заботится о копировании того, что вам нужно.
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
Это означает, что вам нужен шаблон, чтобы игнорировать mainpart
, если все дочерние элементы coating
соответствуют UserProjAttr
. Вернее, если нет потомка coating
, который не соответствует UserProjAttr
<xsl:template match="mainpart[not(proxy/singlepart/part/coating != //project/UserProjAttr)]" />
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="mainpart[not(proxy/singlepart/part/coating != //project/UserProjAttr)]" />
</xsl:stylesheet>
Обратите внимание: если вы используете XSLT 2.0, вы можете использовать переменную в шаблоне, если считаете, что она делает его более читабельным
<xsl:variable name="finish" select="//project/UserProjAttr"/>
<xsl:template match="mainpart[not(proxy/singlepart/part/coating != $finish)]" />
А в XSLT 3.0 шаблон идентификации можно заменить одной строкой ...
<xsl:mode on-no-match="shallow-copy"/>