В вашем вопросе есть небольшое несоответствие, потому что вы говорите, что хотите найти номер, следующий за тегами, но в вашем примере номер для вашего внешнего равен R1234 который, очевидно, содержит букву!
Тем не менее, я придумал следующий шаблон, который можно использовать для «сканирования» для вашего тега
<xsl:template name="sweeper">
<xsl:param name="text"/>
<xsl:param name="tag"/>
<xsl:variable name="search" select="normalize-space(concat(substring-after($text, $tag), '.'))"/>
<xsl:variable name="delimiter" select="substring(translate($search, 'R1234567890', ''), 1, 1)"/>
<xsl:variable name="match" select="substring-before($search, $delimiter)"/>
<xsl:if test="$match != ''">
<link name="{$tag}" id="{$match}"/>
</xsl:if>
</xsl:template>
(где текст - это текст для поиска, а tag - это тег для сортировки.)
Что шаблон делает, так это сначала получает текст «после» тега, который вы ищете.Затем он удаляет все числа из этой строки, а также R, чтобы соответствовать вашим требованиям (если другие буквы действительны, добавьте их сюда).Затем он получает текст, который находится перед первым символом этого усеченного текста, который, как мы надеемся, должен быть желаемым числом.
Вот полный XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="head">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:apply-templates select="//para" mode="sweep"/>
</xsl:copy>
</xsl:template>
<xsl:template match="para" mode="sweep">
<xsl:call-template name="sweeper">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="tag" select="'meta data'"/>
</xsl:call-template>
<xsl:call-template name="sweeper">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="tag" select="'external link'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="sweeper">
<xsl:param name="text"/>
<xsl:param name="tag"/>
<xsl:variable name="search" select="normalize-space(concat(substring-after($text, $tag), '.'))"/>
<xsl:variable name="delimiter" select="substring(translate($search, 'R1234567890', ''), 1, 1)"/>
<xsl:variable name="match" select="substring-before($search, $delimiter)"/>
<xsl:if test="$match != ''">
<link name="{$tag}" id="{$match}"/>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Применительно к вашему вводуXML, следующий вывод:
<xml>
<head>
<title>Test</title>
<link name="meta data" id="1234" />
<link name="external link" id="R12345" />
</head>
<body>
<para>
This is a body text meta data 1234, this is a external link R12345. This is a test para.
</para>
</body>
</xml>