xslt函数用于分隔带分隔符的字符串

时间:2016-01-16 09:42:00

标签: xml xslt xpath

我有一个字符串。我想要一个XSLT函数,它可以使用分隔符“|”分隔字符串的每两个字符。 E.g:

输入ABADFEREWQ

输出AB|AD|FE|RE|WQ.

2 个答案:

答案 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