Под "пропуском фамилии" я так понимаю, вы хотите, чтобы ваш вывод выглядел так:
<person id="101">
<name>XYZ</name>
</person>
<person id="101">
<name>YYY</name>
</person>
В этом случае ваш подход должен включать все элементы person
. Стандартный способ копирования всего, кроме определенного элемента, работает следующим образом:
<xsl:template match="/">
<xsl:apply-templates select="//person"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="last-name">
<!-- Do nothing, you don't want to copy this. -->
</xsl:template>
Я думаю, вы неправильно понимаете, как работают выражения XPath. Ваше выражение //person [not(last-name)]
выбирает все элементы person
, соответствующие условию not(last-name)
, что означает, что оно соответствует любым элементам person
, которые не имеют дочерних элементов last-name
. Он ведет себя именно так, как и должен.