2016-11-03 2 views
0

У меня есть некоторые данные, в которых команда форматирования, созданные в форматеКонвертирования заказа форматирования в HTML форматирования с помощью XSLT

^B Makes the rest of the line bold 
^I Makes the rest of the line italic 

и т.д., и я стараюсь, чтобы превратить это в HTML для <b>, <i> и т.д.

Эти коды могут быть объединены и встречаться в любом месте линии, но применяются только к остальной части линии.

Я пометил данные в строках и использую analyze-string на каждой строке, чтобы забрать метки для создания формы. Проблема в том, что мне нужно открыть инструкцию по форматированию, где я найду ее в строке, но затем закрою ее в конце строки, а то, что у меня не работает, по мере ее открытия и закрытия формата, в котором находится маркер , как и следовало ожидать:

<xsl:analyze-string select="." regex="\^([BIU])"> 
    <xsl:matching-substring> 
     <xsl:element name="{lower-case(regex-group(1))}"/> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:value-of select="." /> 
    </xsl:non-matching-substring> 
</xsl:analyze-string> 

что я получаю от этого:

<b></b> Makes the rest of the line bold 
<i></i> Makes the rest of the line italic 

где то, что я хочу, очевидно

<b> Makes the rest of the line bold </b> 
<i> Makes the rest of the line italic </i> 

Я не могу видеть obvous способ использования analyze-string, чтобы добиться этого, и единственный способ, которым я могу это сделать, - использовать рекурсивную функцию для обработки подстрок-подставок и т. Д., Что кажется довольно запутанным.

Кто-нибудь с лучшей идеей? Благодаря!

Screwtape.

ответ

0

Вам просто нужно добавить еще один шаблон для вашего выражения регулярных выражений, чтобы захватить оставшуюся часть строки после символа, который затем может быть выведена внутри вновь созданного элемента

Попробуйте

<xsl:analyze-string select="." regex="\^([BIU])(.*)"> 
     <xsl:matching-substring> 
      <xsl:element name="{lower-case(regex-group(1))}"> 
       <xsl:value-of select="regex-group(2)" /> 
      </xsl:element> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="." /> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
+0

Это большой начальная точка - работает, за исключением случаев, когда существует более одного формата, но я могу назвать это рекурсивно, что намного лучше, чем попытка рекурсивных подстрочных подстрок. (Я должен был включить пример с более чем одним кодом формата - извините!) – Screwtape

+0

Sorted - переместил строку анализа в вызываемый шаблон и вызвал рекурсивно для управления случаем, когда у вас есть «^ B^I». Огромное спасибо! – Screwtape

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