Это можно сделать простым и коротким способом (без явных условий) :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="cds_dt" exclude-result-prefixes="x">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ContactPurpose/x:PurposeAsPlainText/text()">0</xsl:template>
<xsl:template match="ContactPurpose/*"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>
применительно к следующему документу XML (расширен довключите оба интересующих случая):
<Contact>
<ContactPurpose>
<PurposeAsPlainText xmlns="cds_dt">Call</PurposeAsPlainText>
</ContactPurpose>
<ContactPurpose>
<PurposeAsEnum xmlns="cds_dt">Call</PurposeAsEnum>
</ContactPurpose>
</Contact>
дает требуемый, правильный результат :
<Contact>
<ContactPurpose>0</ContactPurpose>
<ContactPurpose>Call</ContactPurpose>
</Contact>
Объяснение :
Переопределение правила идентификации и правильное использование шаблонов / шаблонов совпадений.
Обновление : ОП изменил свой документ XML, которыйтеперь находится в пространстве имен по умолчанию:
<MyDS xmlns="cds" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PatientRecord>
<Demographics>
<Contact>
<ContactPurpose>
<PurposeAsPlainText xmlns="cds_dt">Call</PurposeAsPlainText>
</ContactPurpose>
<ContactPurpose>
<PurposeAsEnum xmlns="cds_dt">Call</PurposeAsEnum>
</ContactPurpose>
</Contact>
</Demographics>
</PatientRecord>
</MyDS>
Соответственно, здесь есть немного измененное преобразование, которое дает желаемый результат :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="cds_dt" xmlns:c="cds" exclude-result-prefixes="c x">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="c:ContactPurpose/x:PurposeAsPlainText/text()">0</xsl:template>
<xsl:template match="c:ContactPurpose/*"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>
Когда этопреобразование применяется к новому XML-документу (ближайшему выше), создается новый требуемый, правильный результат :
<MyDS xmlns="cds" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PatientRecord>
<Demographics>
<Contact>
<ContactPurpose>0</ContactPurpose>
<ContactPurpose>Call</ContactPurpose>
</Contact>
</Demographics>
</PatientRecord>
</MyDS>