Сначала рассмотрите возможность использования ключа для поиска цифр ...
<xsl:key name="figures" match="figure" use="lower-case(label)" />
(здесь я использую строчные буквы, потому что у вас есть «цифра 02» в тексте, но «цифра 02» в метке).
Ваша основная проблема в том, что в xsl:matching-substring
вы больше не находитесь в контексте исходного узла, который вам подходит, поэтому вы, вероятно, получаете сообщение об ошибке «элемент контекста не является узлом»
Чтобы обойти это, определите переменную, которая позволит вам ссылаться на исходный документ ...
<xsl:variable name="doc" select="/" />
Затем, чтобы получить значение цифры с помощью клавиши, вы можете сделать это ...
<xsl:value-of select="key('figures', lower-case($mk11), $doc)/@id" />
Итак, это будет искать ключ в контексте оригинального документа.
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:key name="figures" match="figure" use="lower-case(label)" />
<xsl:variable name="doc" select="/" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//text()[not(parent::label)]">
<xsl:analyze-string select="." regex="figure\s+\d+" flags="i">
<xsl:matching-substring>
<internal>
<xsl:attribute name="idref">
<xsl:call-template name="mk">
<xsl:with-param name="mk11" select="."/>
</xsl:call-template>
</xsl:attribute>
<xsl:value-of select="."/>
</internal>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
<xsl:template name="mk">
<xsl:param name="mk11"/>
<xsl:value-of select="key('figures', lower-case($mk11), $doc)/@id" />
</xsl:template>
</xsl:stylesheet>
Фактически, вы можете упростить это, покончив с именованным шаблоном и используя шаблоны значений атрибутов для создания атрибута idref
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:key name="figures" match="figure" use="lower-case(label)" />
<xsl:variable name="doc" select="/" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//text()[not(parent::label)]">
<xsl:analyze-string select="." regex="figure\s+\d+" flags="i">
<xsl:matching-substring>
<internal idref="{key('figures', lower-case(.), $doc)/@id}">
<xsl:value-of select="."/>
</internal>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>