Это возможно в XPath 1.0 при условии:
- Вы готовы принять довольно ужасные выражения XPath
- Ваш формат действительно, на самом деле, полностью соответствует формату вы описали (смотрите ответ @ FailedDev и читайте " Программисты лжи верят в имена ")
Если вы согласны с обоими из них, то здесь мыgo:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="text"/>
<xsl:template match="/">
<xsl:variable name="name" select="' Ann: blah blah '"/>
<xsl:variable name="cname"
select="normalize-space(substring-before($name, ':'))"/>
<xsl:variable name="after-first"
select="normalize-space(substring-after($cname, ' '))"/>
<!-- first name -->
[<xsl:value-of select="substring-before(concat($cname, ' '), ' ')"/>]
<!-- middle name -->
[<xsl:value-of select="concat(
substring(substring-before($after-first, ' '), 1,
number(contains($after-first, ' ')) *
string-length($after-first)),
substring('', 1,
number(not(contains($after-first, ' '))) *
string-length('')))"/>]
<!-- last name -->
[<xsl:value-of select="concat(
substring(substring-after($after-first, ' '), 1,
number(contains($after-first, ' ')) *
string-length($after-first)),
substring($after-first, 1,
number(not(contains($after-first, ' '))) *
string-length($after-first)))"/>]
</xsl:template>
</xsl:stylesheet>
Использование:
<xsl:variable name="name" select="' Ann Q. Smith : blah blah '"/>
Выход:
[Ann]
[Q.]
[Smith]
Использование:
<xsl:variable name="name" select="' Ann Smith : blah blah '"/>
Выход:
[Ann]
[]
[Smith]
Использование:
<xsl:variable name="name" select="' Ann: blah blah '"/>
Вывод:
[Ann]
[]
[]