2015-02-26 3 views
1

Прошло слишком много времени на эту, казалось бы, невозможную проблему сегодня, я нахожусь на своем пути. Поблагодарили бы за любую помощь, у вас будет стек stackoverflow высокого и низкого уровня.Извлечение нескольких подстрок из строки в XSLT 1.0

У меня есть строка, которую я пытаюсь манипулировать с помощью XSLT, например.

«человека START красного END женщина START ребенок END кролик START гусь END синего»

Я пытаюсь извлечь все подстроки между началом и концом, и CONCAT в одну новую строку.

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

«красный ребенок гусь»

Спасибо - Роб

+1

Где эта строка берется? Параметр? Входной XML-документ? Если да, пожалуйста, покажите это. Вы действительно ограничены XSLT 1.0? –

ответ

2

Мы не знаем, где эта строка приходит, но при условии ввода документа, как

XML Input

<?xml version="1.0" encoding="UTF-8"?> 
<input>man START red END woman START child END rabbit START goose END blue</input> 

таблицы стилей XSLT

Написать рекурсивную именованный шаблон, который ищет вхождения START и END в строке.

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="input"> 
     <output> 
      <xsl:call-template name="find-relevant-text"> 
       <xsl:with-param name="string" select="."/> 
      </xsl:call-template> 
     </output> 
    </xsl:template> 

    <xsl:template name="find-relevant-text"> 
     <xsl:param name="string"/> 

     <xsl:if test="contains($string,'START')"> 
      <xsl:value-of select="substring-before(substring-after($string,'START '),'END')"/> 
      <xsl:call-template name="find-relevant-text"> 
       <xsl:with-param name="string" select="substring-after($string,'END ')"/> 
      </xsl:call-template> 
     </xsl:if> 

    </xsl:template> 

</xsl:transform> 

XML Output

<?xml version="1.0" encoding="UTF-8"?> 
<output>red child goose </output> 

Если вы обеспокоены символ пробела в конце концов, использовать

<xsl:template name="find-relevant-text"> 
    <xsl:param name="string"/> 

    <xsl:if test="contains($string,'START')"> 

     <xsl:variable name="relevant-part" select="substring-before(substring-after($string,'START '),' END')"/> 
     <xsl:variable name="remainder" select="substring-after($string,'END ')"/> 

     <xsl:value-of select="$relevant-part"/> 
     <xsl:if test="contains($remainder,'START')"> 
      <xsl:text> </xsl:text> 
     </xsl:if> 
     <xsl:call-template name="find-relevant-text"> 
      <xsl:with-param name="string" select="$remainder"/> 
     </xsl:call-template> 
    </xsl:if> 

</xsl:template> 
+0

Благодаря миллиону Mathias, строка исходит из содержимого внешнего HTML-файла, упоминаемого в XML-документе, который я преобразовал в переменную. Я верну свое решение на практике и вернусь к обратной связи. Большое спасибо за ваш ответ. –

+0

@RobMcG Добро пожаловать. Если вы не получите его на работу, пожалуйста, покажите это определение переменной и документ XML - и я рад помочь. –

+0

Большое спасибо Матиасу, который отлично работал. Провел семь часов, пытаясь понять это вчера: ... ... очень ценю вашу помощь. Жизнь спасателя. Еще раз спасибо. –

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