Ваша проблема в том, что когда вы делаете:
<xsl:call-template name="kreator" />
, тогда вы делаете это в контексте <PERSON>
или <GROUP>
, с которым вы сейчас работаете.
Это означает, что position()
сообщит вам позицию этих элементов . Он не может волшебным образом знать, что вас интересует положение первого <ORGANISATION>
, совпадающего с текущим.
И это означает, что вы должны выполнить итерацию всех <ORGANISATION>
почти так же, как вы делаете это для вычисления атрибута <affiliation>
@id
:
<xsl:variable name="affid">
<xsl:variable name="org" select="ADDRESS/ORGANISATION" />
<xsl:for-each select="//ORGANISATION[
generate-id()
=
generate-id(key('affiliations', .)[1])
]">
<xsl:if test=". = $org">
<xsl:number format="0001" value="position()"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
Обратите внимание на использование <xsl:if>
, чтобы убедиться, что переменная в конечном итоге содержит только одно значение, даже если вы просматриваете все из них.
Для больших документов вы можете ввести другой ключ:
<xsl:key name="organisations" match="ORGANISATION" use="'all'" />
и использовать это как замену для всех сравнительно неэффективных выражений "//ORGANISATION
", например, вместо:
<xsl:for-each select="//ORGANISATION">
<!-- ... -->
</xsl:for-each>
использование:
<xsl:for-each select="key('organisations', 'all')">
<!-- ... -->
</xsl:for-each>