3

私は挑戦的な問題を抱えており、これまでのところ解決できませんでした。

私のxlstには、文字列を含む変数があります。次のシーケンス [eol] をこの文字列に追加する必要があります。固定位置、つまり 65 文字ごと

関数またはテンプレートを使用して、この文字を再帰的に追加することを考えました。その理由は、文字列の長さが変化する可能性があるためです。

    <xsl:function name="funct:insert-eol" as="xs:string" >
    <xsl:param name="originalString" as="xs:string?"/>
    <xsl:variable name="length">
        <xsl:value-of select="string-length($originalString)"/>
    </xsl:variable>
    <xsl:variable name="start" as="xs:integer">
        <xsl:value-of select="1"/>
    </xsl:variable>
    <xsl:variable name="eol" as="xs:integer">
        <xsl:value-of select="65"/>
    </xsl:variable>
    <xsl:variable name="newLines">
        <xsl:value-of select="$length idiv number('65')"/>
    </xsl:variable>
    <xsl:for-each select="1 to $newLines">
        <xsl:value-of select="substring($originalString, $start, $eol)" />
    </xsl:for-each>
    </xsl:function>

コードを書けば書くほど、導入する必要のある変数が増えます。これはまだ私の理解不足です。

たとえば、5 文字ごとに [eol] が必要です。

aaaaaaabbbbbbcccccccccc

aaaaa[eol]aabbb[eol]bbbcc[eol]cccccc[eol]cc


誰かが私の出発点を持っていることを願っています..

よろしくダーク

4

3 に答える 3

2

かなり簡単で短い -- 再帰は必要ありません(単一の XPath 式として指定することもできます):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:param name="pLLength" select="5"/>

 <xsl:template match="/*">
  <xsl:variable name="vText" select="string()"/>

  <xsl:for-each select="1 to string-length($vText) idiv $pLLength +1">
    <xsl:value-of select="substring($vText, $pLLength*(position()-1)+1, $pLLength)"/>
    <xsl:if test=
    "not(position() eq last()
       or position() eq last() and string-length($vText) mod $pLLength)">[eol]</xsl:if>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

この変換がこの XML ドキュメントに適用されると、次のようになります。

<t>aaaaaaabbbbbbccccccccc</t>

必要な正しい結果が生成されます。

aaaaa[eol]aabbb[eol]bbbcc[eol]ccccc[eol]cc

この XML ドキュメントが処理されると、次のようになります。

<t>aaaaaaabbbbbbcccccccccddd</t>

ここでも、必要な正しい結果が生成されます。

aaaaa[eol]aabbb[eol]bbbcc[eol]ccccc[eol]ccddd[eol]
于 2013-04-19T02:43:51.200 に答える
0

これを試してください:

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xsl:param name="TextToChange" select="'aaaaaaabbbbbbccccccccc'"/>
  <xsl:param name="RequiredLength" select="xs:integer(5)"/>

  <xsl:template match="/">
    <xsl:call-template name="AddText"/>
  </xsl:template>

  <xsl:template name="AddText">
    <xsl:param name="Text" select="$TextToChange"/>
    <xsl:param name="TextLength" select="string-length($TextToChange)"/>
    <xsl:param name="start" select="xs:integer(1)"/>
    <xsl:param name="end" select="$RequiredLength"/>
    <xsl:choose>
      <xsl:when test="$TextLength gt $RequiredLength">
        <xsl:value-of select="substring($Text,$start,$end)"/>
        <xsl:text>[eol]</xsl:text>
        <xsl:call-template name="AddText">
          <xsl:with-param name="Text" select="substring-after($Text, substring($Text,$start,$end))"/>
          <xsl:with-param name="TextLength"
            select="string-length(substring-after($Text, substring($Text,$start,$end)))"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$Text"/>
      </xsl:otherwise>
    </xsl:choose>

  </xsl:template>

</xsl:stylesheet>
于 2013-04-18T13:51:58.507 に答える