Перейти к содержанию

Нахождение позиции начала подстроки

Задача

Требуется найти индекс позиции, с которой начинается подстрока, а не текст до или после этой подстроки.

Решение

XSLT 1.0

<xsl:template name="str:index-of">
    <xsl:param name="input"/>
    <xsl:param name="substr"/>
    <xsl:choose>
        <xsl:when test="contains($input, $substr)">
            <xsl:value-of select="string-length(substring-before($input, $substr))+1"/>
        </xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
</xsl:template>

XSLT 2.0

<xsl:function name="ckbk:string-index-of">
    <xsl:param name="input"/>
    <xsl:param name="substr"/>
    <xsl:sequence select="if (contains($input, $substr)) then string-length(substring-before($input, $substr))+1 else 0"/>
</xsl:function>

Обсуждение

Позиция начала подстроки – это длина предшествующей ей строки плюс 1. Если вы точно знаете, что исходная строка содержит данную подстроку, то можете просто вычислить выражение string-length(substring-before($input, $substr)) + 1. Но в общем случае нужно обрабатывать также случай, когда подстрока не входит в строку. Мы в этой ситуации возвращаем 0, но можно выбрать и какой-нибудь другой индикатор, например, -1 или NaN.