Рассмотрим ваш первый шаблон…
<xsl:template match="//StepFusionSet">
… применительно к элементам SF1
и (вложенным) SF2
:
<StepFusionSet name="SF1">
<StepFusionSet name="SF2">
</StepFusionSet>
</StepFusionSet>
Шаблон соответствует вашему внешнему SF1
элемент;однако затем его необходимо повторно применить к дочерним элементам сопоставленного элемента, чтобы он соответствовал вашему внутреннему SF2
.
Это может быть достигнуто путем встраивания рекурсивного <xsl:apply-templates/>
во второе определение шаблона:
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//StepFusionSet">
<xsl:call-template name="a"/>
</xsl:template>
<xsl:template name="a">
<xsl:apply-templates select="@name"/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
В качестве альтернативы, вы можете использовать элемент <xsl:for-each>
, чтобы выбрать все ваши элементы <StepFusionSet>
(включая вложенные, такие как SF2
):
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="//StepFusionSet">
<xsl:value-of select="@name"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>