2013-08-26 1 views
-1

Я новичок в XSLT. Мне нужно завершить длинную строку после определенного количества разделителей. Пример такой строки является: -XSLT - Завершение строки после разграничителя 5 (например, 5 "|)

Джейсон | Майкл | Джон | Джеймс | Рик | Пол | JenYee | Ray | Элиза | Шилпа | Абхишек | Патрик | Brent | Кевин | Джим

я не хотите использовать шаблон для этого из-за некоторых ограничений.

Однако, если это невозможно - я в порядке с шаблоном.

Выход должен быть таким:
Линия 1: Джейсон | Майкл | Джон | Джеймс | Рик | Линия 2: Пол | JenYee | Ray | Eliza | Shilpa | Строка 3: Abhishek | Patrick | Brent | Kevin | Jim

+0

Не ясно, что вы имеете в виду «завернуть». Вы хотите * усечь * строку после 5 разделителей? Вы дали примерную строку ввода выше; пожалуйста, покажите, какой будет выход для этой строки. – LarsH

+0

Линия 1: Джейсон | Майкл | Джон | Джеймс | Рик | Линия 2: Пол | JenYee | Ray | Eliza | Shilpa | Строка 3: Abhishek | Patrick | Brent | Kevin | Jim – apratik

+1

ОК, вы хотите * обернуть * строку после 5 разделителей. Другими словами, вы хотите вывести все части строки, а не только первые 5, но разбить на несколько строк. Похоже, что оба из тех, кто ответил, до сих пор неправильно понимали, что вы хотели. Предложение: отредактируйте свой вопрос, чтобы вы могли показать желаемый результат, отформатированный таким образом, который легко читать. – LarsH

ответ

1

Если вы можете использовать XSLT 2.0, вы можете использовать tokenize().

Пример ($input это строка в вашем вопросе):

<xsl:value-of select="tokenize($input,'\|')[5 >= position()]" separator="|"/> 

Это произведет: Jason|Michael|John|James|Rick

+0

У меня есть ограничение на использование только XSLT1.0. Это проблема. – apratik

2

Используйте это рекурсивные шаблоны:

<xsl:template name="beforeSeparators"> 
    <xsl:param name="start"/> 
    <xsl:param name="rest"/> 
    <xsl:param name="separator"/> 
    <xsl:param name="count"/> 
    <xsl:choose> 
    <xsl:when test="$count &lt;= 0"> 
     <xsl:value-of select="$start"/> 
    </xsl:when> 
    <xsl:when test="contains($rest,$separator)"> 
     <xsl:call-template name="beforeSeparators"> 
     <xsl:with-param name="start" select="concat($start,substring-before($rest,$separator),$separator)"/> 
     <xsl:with-param name="rest" select="substring-after($rest,$separator)"/> 
     <xsl:with-param name="separator" select="$separator"/> 
     <xsl:with-param name="count" select="$count - 1"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="concat($start,$rest)"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="wrap"> 
    <xsl:param name="str"/> 
    <xsl:param name="separator"/> 
    <xsl:param name="separatorsPerLine"/> 
    <xsl:variable name="line"> 
    <xsl:call-template name="beforeSeparators"> 
     <xsl:with-param name="start" select="''"/> 
     <xsl:with-param name="rest" select="$str"/> 
     <xsl:with-param name="separator" select="$separator"/> 
     <xsl:with-param name="count" select="$separatorsPerLine"/> 
    </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="concat($line,'&#x0d;&#x0a;')"/> 
    <xsl:if test="string-length($line) &lt; string-length($str)"> 
    <xsl:call-template name="wrap"> 
     <xsl:with-param name="str" select="substring($str,string-length($line))"/> 
     <xsl:with-param name="separator" select="$separator"/> 
     <xsl:with-param name="separatorsPerLine" select="$separatorsPerLine"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

называется так:

<xsl:call-template name="wrap"> 
    <xsl:with-param name="str" select="'Jason|Michael|John|James|Rick|Paul|JenYee|Ray|Eliza|Shilpa|Abhishek|Patrick|Brent|Kevin|Jim'"/> 
    <xsl:with-param name="separator" select="'|'"/> 
    <xsl:with-param name="separatorsPerLine" select="5"/> 
</xsl:call-template> 

производит:

Jason|Michael|John|James|Rick| 
Paul|JenYee|Ray|Eliza|Shilpa| 
Abhishek|Patrick|Brent|Kevin| 

Вот мой полный тест XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text"/> 

    <xsl:template name="beforeSeparators"> 
    <xsl:param name="start"/> 
    <xsl:param name="rest"/> 
    <xsl:param name="separator"/> 
    <xsl:param name="count"/> 
    <xsl:choose> 
     <xsl:when test="$count &lt;= 0"> 
     <xsl:value-of select="$start"/> 
     </xsl:when> 
     <xsl:when test="contains($rest,$separator)"> 
     <xsl:call-template name="beforeSeparators"> 
      <xsl:with-param name="start" select="concat($start,substring-before($rest,$separator),$separator)"/> 
      <xsl:with-param name="rest" select="substring-after($rest,$separator)"/> 
      <xsl:with-param name="separator" select="$separator"/> 
      <xsl:with-param name="count" select="$count - 1"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="concat($start,$rest)"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template name="wrap"> 
    <xsl:param name="str"/> 
    <xsl:param name="separator"/> 
    <xsl:param name="separatorsPerLine"/> 
    <xsl:variable name="line"> 
     <xsl:call-template name="beforeSeparators"> 
     <xsl:with-param name="start" select="''"/> 
     <xsl:with-param name="rest" select="$str"/> 
     <xsl:with-param name="separator" select="$separator"/> 
     <xsl:with-param name="count" select="$separatorsPerLine"/> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="concat($line,'&#x0d;&#x0a;')"/> 
    <xsl:if test="string-length($line) &lt; string-length($str)"> 
     <xsl:call-template name="wrap"> 
     <xsl:with-param name="str" select="substring($str,string-length($line)+1)"/> 
     <xsl:with-param name="separator" select="$separator"/> 
     <xsl:with-param name="separatorsPerLine" select="$separatorsPerLine"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="/"> 
    <xsl:call-template name="wrap"> 
     <xsl:with-param name="str" select="'Jason|Michael|John|James|Rick|Paul|JenYee|Ray|Eliza|Shilpa|Abhishek|Patrick|Brent|Kevin|'"/> 
     <xsl:with-param name="separator" select="'|'"/> 
     <xsl:with-param name="separatorsPerLine" select="5"/> 
    </xsl:call-template> 
    </xsl:template> 

</xsl:stylesheet> 

(это просто перевести фиксированную строку ,, так что он может быть применен к любой XML)

+0

Есть ли способ достичь этого без использования шаблона? – apratik

+1

@apratik: no - вам нужна рекурсия, и, следовательно, вам нужен шаблон, который может называть себя – MiMo

+2

Я исправил свой ответ на основе ваших комментариев, отвечая Lars – MiMo