Давайте пройдемся по вашим шагам, потому что совершенно ясно, что происходит и как это исправить.
Вы начинаете со следующей строки: "Smith Antony Blah Jones"
Затем вы присваиваете переменнуюquery
результат substring-before
в первой строке.Это присваивает "Smith"
query
.
Затем вы присваиваете query2
значение substring-before
substring-after
вашей исходной строки.substring-after
возвращает "Antony Blah Jones"
, а substring-before
возвращает "Antony"
.Пока все хорошо.
Теперь ваше следующее назначение ищет "Antony"
в исходной строке, но затем полученная строка будет " Blah Jones"
, поэтому, когда вы запускаете substring-before
, вы соответствуете самому первому пробелу.
Существует множество возможных решений.Очевидным будет вызов substring-after
перед вызовом substring-before
, например:
<xsl:value-of
select="substring-before(substring-after(substring-after(root/@query, $query1), ' '),' ')"
/>
Но это довольно уродливо.В качестве альтернативы вы можете использовать substring
или просто добавить пробел к "Antony"
при первом вызове substring-after
.
Я думаю, что вам лучше определить рекурсивный шаблон для получения следующего токена, а затемпередать оставшуюся строку себеЭто позволит вам получить произвольное количество разделенных пробелами токенов из строки без необходимости иметь так много пронумерованных переменных.Примерно так:
<xsl:template name="recursive-tokenizer">
<xsl:param name="input"/>
<xsl:choose>
<!-- Test whether the input token contains a space. -->
<xsl:when test="contains($input,' ')">
<!-- Output a token. -->
<xsl:value-of select="substring-before($input,' ')"/>
<!-- Call this template with the rest of the string. -->
<xsl:call-template name="recursive-tokenizer">
<xsl:with-param name="input" select="substring-after($input,' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- There is no space, so just output the input. -->
<xsl:value-of select="$input"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>