Вы скручиваете это от неправильного конца (неправильный конец почти всегда: пытаетесь применить парадигму императивного программирования к XSLT).
Это действительно легко сделать с помощью сопоставления с шаблоном.
<xsl:template match="RootNode">
<PersonsName>
<xsl:value-of select="Name"/>
</PersonsName>
<xsl:apply-templates select="ContactDetails|AltContactDetails" />
</xsl:template>
<xsl:template match="ContactDetails|AltContactDetails">
<xsl:copy>
<FirstLine>
<xsl:value-of select="Address/Line1"/>
</FirstLine>
<Town>
<xsl:value-of select="Address/Town"/>
</Town>
<PostalCode>
<xsl:value-of select="Address/Postcode"/>
</PostalCode>
</xsl:copy>
</xsl:template>
Откажитесь от идеи, что вы должны указывать процессору XSLT, что делать (через создание именованных шаблонов и называть их «императивным стилем»).
Процессор XSLT выбирает, какие шаблоны вызывать. Начиная с корня (/
), он рекурсивно проверяет соответствие шаблонов для каждого посещаемого узла. Он самостоятельно просматривает ваш входной XML - ваша единственная задача - предоставить ему соответствующие шаблоны для тех узлов, которые вы хотите обработать особым образом.
Вы можете добавить пользовательский шаблон для тех узлов, которые нуждаются в особой обработке, и доверить своему процессору XSLT вызов его, как только они появятся. Все, что вам нужно, чтобы убедиться в том, что ваши шаблоны продолжаются, объявив соответствующий <xsl:apply-templates />
.