2013-02-25 3 views
0

Привет, У меня есть нижняя строка в формате XML, а также мне нужна гиперссылка на номер. Я хочу, чтобы этот вывод отображался в формате HTML.Разделить и объединить строку в XSLT

<main> 
<alph>a b 2,3</alph> 
</main> 

Я хочу XSLT, который дает выход как:

a b 2, a b 3 

Я попытался ниже XSLT:

<xsl:template match="alph"> 
    <xsl:variable name="link" select="normalize-space(translate(
    normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/> 
    <xsl:value-of select="substring-before(normalize-space(.),$link)"/> 
    <xsl:variable name="tex"> 
    <xsl:value-of select="text()"/> 
    </xsl:variable> 
    <xsl:choose> 
    <xsl:when test="contains($link,',')"> 
     <xsl:variable name="new"> 
     <xsl:value-of select="tokenize($link,',')"/> 
     </xsl:variable> 
     <xsl:value-of select="concat($new,$tex)"/> 
    </xsl:when> 
    <xsl:when test="contains($link,'-')"> 
     <xsl:value-of select="tokenize($link,'-')"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$link"/> 
    </xsl:otherwise> 
    </xsl:choose> 

Но это дает мне выход, как:

a b 2 3a b 2,3 

Thanks

+0

Я предполагаю, что вы используете XSLT 2.0? –

+0

да друг, я использую xslt 2.0. не могли бы вы отредактировать или предоставить мне решение о том, как это сделать. пожалуйста, –

+0

Не могли бы вы дать мне знать, как это сделать в XSLT1.0, спасибо –

ответ

1

Одна из проблем, у вас есть с переменной ссылка

<xsl:variable name="link" select="normalize-space(translate(
    normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/> 

Похоже, что вы пытаетесь удаления всех символов алфавита из строки, так что вы остались только с 2,3. Однако для этого необходимо выполнить abc ... xyz необходимо добавить в апострофы, иначе он будет искать элемент с именем abc ... xyz. Сказав это, вы говорите, что вы используете XSLT2.0, так что вы можете использовать заменить функции здесь, которая принимает регулярное выражение в качестве параметра

<xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/> 

Далее, вы можете получить текст до этого ссылка, как так

<xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/> 

Это даст вам ваш аЬ

Наконец, вы можете использовать tokenize Функция разделения 2,3. В вашем XSLT вы, похоже, тоже ищете дефисы, но функция tokenize также использует регулярные выражения, поэтому это не проблема. Что вы можете сделать, это просто разметить строку, и вновь присоединиться к нему с помощью текста переменных в качестве разделителя

<xsl:value-of select="concat($text, ' ')"/> 
    <xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/> 

Вот полного XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="alph"> 
     <xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/> 
     <xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/> 
     <xsl:value-of select="concat($text, ' ')"/> 
     <xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/> 
    </xsl:template> 
</xsl:stylesheet> 

При нанесении на вашем XML, то следующий вывод

a b 2, a b 3 
+0

Спасибо за решение, это сработало –

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