2012-04-13 3 views
1

У меня есть строка, как показано ниже проанализировано с помощью XSLTXSLT - Фильтр отдельных слов из текста

boy "happy family" filetype:pdf girl 

Из приведенных выше строк, мне нужно отфильтровать только отдельные слова «мальчик» и «девочку» и получить еще строка как

boy girl 

Как мне добиться этого?

+0

Тааак .. игнорирующие значения кавычки и '\ w + \: \ w +' значения? – Neil

+0

@Neil: Да. Это возможные варианты, которые могут произойти в строке – itsbalur

+1

. Получаю это правильно: вам нужно удалить все между первым и последним пространством в текстовом() значении узла, используя XSLT? - Если вы можете это сделать, я бы использовал что-то JavaScript или так. XSLT предназначен для управления структурами XML, а не содержимым (значениями). – Efrain

ответ

1

С XSLT 2.0 у вас есть функция replace с регулярным выражением, поэтому replace('boy "happy family" filetype:pdf girl', '"[^"]*"|\w+:\w+', '') должен работать. С XSLT 1.0 я должен проверить, поддерживает ли ваш процессор XSLT 1.0 аналогичную функцию расширения

+0

Спасибо. Я использую XSLT 1.0 и обнаружил, что замена функции расширения не поддерживается. Что вы предложите в качестве альтернативы? – itsbalur

+0

Мое предложение было бы функцией расширения, но еще один плакат уже предложил функцию замены EXSLT, и ваш комментарий предполагает, что вы также не можете использовать это. В этом случае XSLT 1.0 может оказаться не лучшим инструментом, хотя вы можете проверить, могут ли существующие шаблоны заменяемых строк выполнять задание, см. Http://www.dpawson.co.uk/xsl/sect2/replace.html. –

0

Для XSLT 1.0 есть замена в пространстве имен http://exslt.org/regular-expressions (см.), но, как отметил Мартин, вашему процессору потребуется поддержка расширений.

<xsl:value-of select="{http://exslt.org/regular-expressions}replace(STRING, '&quot;.*&quot;|\w+:\w+', '')"/> 

предоставит то, что вы просили.

+0

Спасибо @hroptatyr. Что было бы альтернативой для XSLT 1.0 без использования функций расширения? – itsbalur

+0

зависит от вашей конкретной среды, ссылка, которую я опубликовал, содержит реализации в javascript и MSXSL. И AFAIK нет никакой переносимой версии XSLT 1.0. – hroptatyr

0

Вот 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(., '&quot;') or contains(.,':')) 
     and 
      count(preceding-sibling::*[contains(., '&quot;')]) mod 2 = 0 
     ]"> 

     <xsl:value-of select="concat(., ' ')"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Когда этот преобразование применяется на следующий документ XML (предоставленного текста, завернутый в один верхний элемент):

<t>boy &quot;happy family&quot; filetype:pdf girl</t> 

разыскиваемых, правильный результат получается:

boy girl 

То же правильный вывод производится в случае следующего, более сложным XML документ:

<t>boy &quot; very happy family &quot; filetype:pdf girl</t> 
+0

Спасибо за помощь. Извините, мои знания в XSLT довольно ограничены. Я думаю, где взять файл strSplit-to-Words.xsl? – itsbalur

+0

@itsbalur: Дом проекта FXSL находится по адресу: http://sf.net/projects/fxsl. Существуют отдельные версии XSLT 1.0 и версии XSLT 2.0.Последняя версия XSLT 1.0 находится по адресу: http://sourceforge.net/projects/fxsl/files/fxsl/FXSL%201.2/. Последняя версия XSLT 2.0 находится по адресу: http://sourceforge.net/projects/fxsl/files/FXSL%20for%20XSLT%202/FXSL%202.0/. Вы можете больше узнать о FXSL либо по адресу http://fxsl.sf.net, либо по адресу: http://conferences.idealliance.org/extreme/html/2003/Novatchev01/EML2003Novatchev01.html или по адресу: http: // conference. idealliance.org/extreme/html/2006/Novatchev01/EML2006Novatchev01.html –

Смежные вопросы