我有一个字符串。我想要一个XSLT函数,它可以使用分隔符“|”分隔字符串的每两个字符。 E.g:
输入ABADFEREWQ
输出AB|AD|FE|RE|WQ.
答案 0 :(得分:2)
如果您使用的是XSLT 2.0,则可以使用replace()
...
XML输入
<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的示例,但稍微简单......
XSLT 1.0 ( 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>
答案 1 :(得分: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