-1

我是 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号线:​​阿布舍克|帕特里克|布伦特|凯文|吉姆

4

2 回答 2

2

使用这个递归模板:

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

于 2013-08-26T21:13:21.493 回答
1

如果可以使用 XSLT 2.0,则可以使用tokenize().

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

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

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

于 2013-08-26T19:53:30.633 回答