Путь, начинающийся с //
, является абсолютным путем, который выбирает всех потомков узла root документа. Таким образом, ваша переменная всегда содержит все узлы ReferenceNo
во всем документе XML, независимо от текущего узла ReferenceNo
. А в XSLT 1.0 инструкция xsl:value-of
возвращает только значение первого узла в выбранном наборе узлов.
Если изменить переменную так, чтобы она содержала только текущий узел ReferenceNo
:
<xsl:variable name="incidentNumbers" select="."/>
это будет работать так, как вы ожидаете.
Конечно, все это чрезвычайно сложно. Переменная не нужна, и, прежде всего, не нужно прибегать к хаку, например:
*[local-name() ='ReferenceNo']
Кроме того, предпочтительнее использовать явные пути вместо //
. Например:
<xsl:template match="/Subjects">
<RefNos>
<xsl:for-each select="Subject">
<RefNo>
<xsl:value-of select="Incidents/Incident/ReferenceNo"/>
</RefNo>
</xsl:for-each>
</RefNos>
</xsl:template>
должно хорошо работать в этом случае.