Вот XSLT 1.0 решение, которое использует лексемизацию предоставленный FXSL (написанной себя в XSLT 1.0) и функции xxx:node-set()
расширения, как это предусмотрено в XSLT 1.0 процессор используется:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext">
<xsl:import href="strSplit-to-Words.xsl"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="/"/>
<xsl:with-param name="pDelimiters"
select="' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:for-each select=
"ext:node-set($vwordNodes)/*
[not(contains(., '"') or contains(.,':'))
and
count(preceding-sibling::*[contains(., '"')]) mod 2 = 0
]">
<xsl:value-of select="concat(., ' ')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда этот преобразование применяется на следующий документ XML (предоставленного текста, завернутый в один верхний элемент):
<t>boy "happy family" filetype:pdf girl</t>
разыскиваемых, правильный результат получается:
boy girl
То же правильный вывод производится в случае следующего, более сложным XML документ:
<t>boy " very happy family " filetype:pdf girl</t>
Тааак .. игнорирующие значения кавычки и '\ w + \: \ w +' значения? – Neil
@Neil: Да. Это возможные варианты, которые могут произойти в строке – itsbalur
. Получаю это правильно: вам нужно удалить все между первым и последним пространством в текстовом() значении узла, используя XSLT? - Если вы можете это сделать, я бы использовал что-то JavaScript или так. XSLT предназначен для управления структурами XML, а не содержимым (значениями). – Efrain