Одна из проблем, с которой вы столкнулись, связана с этой строкой
<xsl:for-each select="mainpart/proxy" >
Это шаблон, соответствующий mainpart
, поэтому вышеприведенный оператор ищет другой mainpart
, который является дочерним по отношению к текущему * 1006.* которого явно не существует
Вам действительно не нужно xsl:for-each
в любом случае, если будет только один proxy
.
Вы должны также обернуть xsl:copy
в xsl:if
, который проверяет, хотите ли вы основную часть или нет.
Попробуйте это так ...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:variable name="namedfinish" select="/modelExtract/header/project/UserProjAttr"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="mainpart" >
<xsl:variable name="BaseId" select="proxy/@basepart" />
<xsl:variable name="mainfinish" select="proxy/singlepart/part[@id = $BaseId]/coating/@key" />
<xsl:if test="$mainfinish != $namedfinish">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="proxy">
<xsl:copy>
<xsl:apply-templates select="@*|singlepart[part/coating/@key = $namedfinish]" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
В качестве альтернативы, поскольку у вас есть шаблоны удостоверений, которые отвечают за копирование всех узлов без изменений, вы можете переписать его, чтобы иметь другие шаблоны, соответствующие тем вещам, которые вы не хотите копировать.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="mainpart[proxy/singlepart/part[@id = ../../@basepart]/coating/@key = /modelExtract/header/project/UserProjAttr]" />
<xsl:template match="singlepart[part/coating/@key != /modelExtract/header/project/UserProjAttr]" />
</xsl:stylesheet>
Делатьобратите внимание, что в XSLT 1.0 считается ошибкой использовать имена переменных в совпадениях с шаблонами, поэтому во втором показанном XSLT удалено namedfinish
.