Как найти все числа в строке с XSLT 1
Есть несколько хороших решений, как найти все числа в строке для XSLT 2 и даже 3. Как я могу сделать то же самое в пределах XSLT 1
(с возможной помощью EXSLT)?
Вот пример:
<data>
<sig>NL Mellin 1-1 36</sig>
<sig>NL Mellin 1-1 38</sig>
<sig>NL Mellin 1-10 02</sig>
<sig>NL Mellin 1-10 04</sig>
<sig>NL Mellin 1-10 09</sig>
</data>
Желаемый результат будет:
1 1 36
1 1 38
1 10 02
1 10 04
1 10 09
1 ответ
Решение
Попробуйте это так:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:template match="/">
<xsl:for-each select="data/sig">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="translate(., '-', ' ')"/>
</xsl:call-template>
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
<xsl:if test="$token = translate($token, translate($token, '0123456789', ''), '')">
<xsl:value-of select="$token"/>
<xsl:text> </xsl:text>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Примечание:
Если у вас есть несколько разделителей, вам нужно перевести их в общий символ (пробел в моем примере);
Я не удосужился удалить пробел в каждой строке;
Если ваш процессор поддерживает функцию EXSLT str:tokenize(), это может быть проще.