-1

私は XSLT の初心者です。特定の数の区切り文字が発生した後、長い文字列をラップする必要があります。このような文字列の例: -

ジェイソン|マイケル|ジョン|ジェームズ|リック|ポール|ジェンイー|レイ|エリザ|シルパ|アビシェーク|パトリック|ブレント|ケビン|ジム

いくつかの制約があるため、これにテンプレートを使用したくありません。

ただし、それが不可能な場合は、テンプレートで問題ありません。

出力は次のようになります:
1 行目: Jason|Michael|John|James|Rick| 2行目: ポール|ジェンイー|レイ|エリザ|シルパ| 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 に答える