2016-01-16 5 views

ответ

0

Попробуйте это:

XML:

<root> 
<string>ABADFEREWQ</string> 
</root> 

XSLT:

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

<xsl:template match="string"> 
    <xsl:call-template name="stringPipe"> 
     <xsl:with-param name="var1" select="."/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="stringPipe"> 
    <xsl:param name="var1"/> 

    <xsl:value-of select="substring($var1, 1,2)"/><!--get first two chars --> 
    <xsl:variable name="var2"> 
     <xsl:value-of select="substring($var1, 3)"/> 
    </xsl:variable> 
    <xsl:if test="string-length($var2) > 0"><xsl:value-of select="'|'"/></xsl:if><!--after first two chars, if text still found, then insert '|' symbol --> 
    <xsl:choose> 
     <xsl:when test="string-length($var2) > 2"><!--after first two chars, rest of string's length is greater than two, then loop process to insert '|' symbol --> 
      <xsl:call-template name="stringPipe"> 
       <xsl:with-param name="var1" select="$var2"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise><!--after first two chars, rest of string's length is NOT greater than two, then display the text --> 
      <xsl:value-of select="$var2"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

Результат:

AB|AD|FE|RE|WQ 
+0

Привет, Rudramuni, большое спасибо за вашу помощь. Я пытаюсь отправить результат через поле, которое определено в другом шаблоне, при этом он бросает ошибку «var2 not defined», не могли бы вы рассказать мне, нужно ли мне сделать эту переменную глобальной – Fatima

+0

@Fatima. Вы должны обновить свой вопрос с помощью XSLT, чтобы мы могли видеть, как вы пытаетесь использовать этот ответ. –

+0

@ DanielHaley Я новичок на этом сайте, я пытаюсь отправить раздел кода вам, но не могу найти, вы можете поделиться своим идентификатором электронной почты, я могу отправить его вам. – Fatima

1

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

XML Input

<root> 
    <string>ABADFEREWQ</string> 
</root> 

XSLT 2.0 (WORKING EXAMPLE)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="string"> 
    <xsl:copy> 
     <!-- 
     Inner replace() adds '|' after every 2 characters. 
     Outer replace() strips off the trailing '|'. 
     --> 
     <xsl:value-of select="replace(
           replace(
            normalize-space(), 
            '(.{2})', 
            '$1|'), 
           '\|$', 
           '')"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Выход

<root> 
    <string>AB|AD|FE|RE|WQ</string> 
</root> 

Если вы застряли с помощью XSLT 1.0, вот пример, который очень близок к Rudramuni TP, но немного проще ...

(WORKING EXAMPLE)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="string"> 
    <xsl:copy> 
     <xsl:call-template name="delimString"> 
     <xsl:with-param name="string" select="normalize-space()"/> 
     </xsl:call-template> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template name="delimString"> 
    <xsl:param name="string"/> 
    <xsl:variable name="remainder" select="substring($string,3)"/> 
    <xsl:value-of select="substring($string,1,2)"/> 
    <xsl:if test="$remainder"> 
     <xsl:text>|</xsl:text> 
     <xsl:call-template name="delimString"> 
     <xsl:with-param name="string" select="$remainder"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Хорошие две версии XSLT-кода, плюс один. –

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