I.Вы можете сделать что-то подобное в XSLT 2.0 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="s">
<xsl:variable name="vWords" select=
"tokenize(lower-case(string(.)),
'[\s.?!,;—:\-]+'
) [.]
"/>
<xsl:sequence select=
" for $current in .,
$i in 1 to count($vWords)
return
if($vWords[$i] eq 'blood'
and
$vWords[$i+1] eq 'pressure'
)
then .
else ()
"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Когда это преобразование XSLT 2.0 применяется к следующему XML-документу (такого документа в вопросе не предусмотрено !!!):
<t>
<s>He has high blood pressure.</s>
<s>He has high Blood Pressure.</s>
<s>He has high Blood
Pressure.</s>
<s>He was coldblood Pressured.</s>
</t>
требуемый, правильный результат (создаются только элементы, содержащие `" кровь "и" давление "(без учета регистра и как два соседних слова) :
<s>He has high blood pressure.</s>
<s>He has high Blood Pressure.</s>
<s>He has high Blood
Pressure.</s>
Объяснение :
Использование функции tokenize()
для разделения строк из nn-буквенных символов сФлаги для нечувствительности к регистру и многострочного режима.
Итерация по результату tokenize()
для нахождения слова "blood"
, за которым сразу следует слово "pressure"
.
II. Решение XSLT 1.0 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vSpaaaceeees" select=
"' '
"/>
<xsl:variable name="vAlpha" select="concat($vLower, $vUpper)"/>
<xsl:template match="s">
<xsl:variable name="vallLower" select="translate(., $vUpper, $vLower)"/>
<xsl:copy-of select=
"self::*
[contains
(concat
(' ',
normalize-space
(translate($vallLower, translate($vallLower, $vAlpha, ''), $vSpaaaceeees)),
' '
),
' blood pressure '
)
]
"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
, когда это преобразование применяется к тому же XML-документу (см. Выше)получается тот же самый результат: :
<s>He has high blood pressure.</s>
<s>He has high Blood Pressure.</s>
<s>He has high Blood
Pressure.</s>
Пояснение :
Преобразование в нижний каскаде.
Использование метода двойного перевода для замены любого не-буквенного символа на пробел.
Затем с помощью normalize-space()
заменить любую группу смежных пробелов одним пробелом.
Затем окружить этот результат пробелами.
Наконец, проверяем, еслитекущий результат содержит строку " blood pressure "
.