У меня есть строка. Я хочу функцию XSLT, которая может разделять каждые два символа строки с разделителем '|'. Например .:Функция xslt для разделения строки с разделителем
Входной ABADFEREWQ
Выход AB|AD|FE|RE|WQ.
У меня есть строка. Я хочу функцию XSLT, которая может разделять каждые два символа строки с разделителем '|'. Например .:Функция xslt для разделения строки с разделителем
Входной ABADFEREWQ
Выход AB|AD|FE|RE|WQ.
Попробуйте это:
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
Привет, Rudramuni, большое спасибо за вашу помощь. Я пытаюсь отправить результат через поле, которое определено в другом шаблоне, при этом он бросает ошибку «var2 not defined», не могли бы вы рассказать мне, нужно ли мне сделать эту переменную глобальной – Fatima
@Fatima. Вы должны обновить свой вопрос с помощью XSLT, чтобы мы могли видеть, как вы пытаетесь использовать этот ответ. –
@ DanielHaley Я новичок на этом сайте, я пытаюсь отправить раздел кода вам, но не могу найти, вы можете поделиться своим идентификатором электронной почты, я могу отправить его вам. – Fatima
Если вы используете 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, но немного проще ...
<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>
Хорошие две версии XSLT-кода, плюс один. –
Что вы пробовали написать код? –