Это короткое и простое (без явных условных указаний) преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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="employee">
<employee active="{activeFlag}">
<xsl:apply-templates select="node()|@*"/>
</employee>
</xsl:template>
<xsl:template match="activeFlag"/>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<employees>
<employee>
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<activeFlag>true</activeFlag>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
дает желаемый, правильный результат :
<employees>
<employee active="true">
<employeeNumber>1234</employeeNumber>
<startdate>01/02/2003</startdate>
<firstname>Erik</firstname>
<address>
<addressline1>123 Main</addressline1>
<zip>07016</zip>
<state>New Jersey</state>
<city>My City</city>
</address>
</employee>
</employees>
Объяснение : переопределение правила идентификации , использование AVT .
Если вы хотите правильно обрабатывать случаи, когда нет дочернего элемента activeFlag
, это немного усложняется :
<xsl:template match="employee">
<employee active=
"{concat(activeFlag,
substring('false',
1 div not(activeFlag))
)
}">
<xsl:apply-templates select="node()|@*"/>
</employee>
</xsl:template>