XSLT - 分隔符计数 5 后的字符串包装(例如 5 "|")



我是XSLT新手。我需要在出现一定数量的分隔符后结束一个长字符串。这样一个字符串的例子是:-

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

由于一些限制,我不想为此使用模板。

但是,如果不可能的话,我可以接受这个模板。

输出应该是这样的:
1号线:Jason | Michael | John | James | Rick | 2号线:Paul | JenYee | Ray | Eliza | Shilpa | 3号线:Abhishek | Patrick | Brent | Kevin | Jim

使用以下递归模板:

<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)

如果可以使用XSLT2.0,则可以使用tokenize()

示例($input是问题中的字符串):

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

这将产生:Jason|Michael|John|James|Rick

相关内容

  • 没有找到相关文章

最新更新