0

次の問題または課題に直面しています。ソース XML に 450 文字の要素があります。xslt を使用して、これを 75 文字のチャンクに変換したいと考えています。

...    
<T61>
     <parentInfo>SomeInfo</parentInfo>
     <T86>
        <info>abcdefghijklmnopqrstuvwxyz01234567890abcdefghijklmnopqrstuvwxyz01234567890</info>
     </T86>
    </T61>
...

生成する出力は次のようになります。

<T31>    
    <x>abcdefghijklmnopqrstuvwxyz01234567890</x>
</T31>
<T31>
    <x>abcdefghijklmnopqrstuvwxyz01234567890</x>
</T31>

私のコードでは、彼の仕事をする T61 のテンプレートを使用しています。T86 用の別のテンプレートを作成し、T61 テンプレート内からこれを呼び出すことを考えましたが、完全な文字列があるため、これは機能しないようです。文字列を 75 の部分に分割できる関数を作成しました。しかし、関数の結果はまだ完全な文字列です。

以前の投稿の関数を使用しました:

        <xsl:function name="my:splitItUp" as="xs:string">
        <xsl:param name="input" as="xs:string"/>
        <xsl:param name="chunk-size" as="xs:integer"/>
        <xsl:value-of>
            <xsl:for-each-group select="string-to-codepoints($input)" group-by="(position() -1) idiv $chunk-size">
                <xsl:sequence select="codepoints-to-string(current-group())"/>
            </xsl:for-each-group>
        </xsl:value-of>
    </xsl:function>
...
    <xsl:template match="T86">
     <xsl:for-each select="my:splitItUp(info, 75)">
        <T31>
            <communication>
            <xsl:value-of select="." />
            </communication>
        </T31>
        </xsl:for-each>
    </xsl:template>

この構造は、常に完全な文字列になります。デバッグでは、分割されていることがわかりますが、結果が連結されています。どういうわけか機能から抜け出すことはできますか?

よろしくダーク

4

1 に答える 1

1

<xsl:param name="stringRequired" select="xs:integer(13)"/>チャンク テキストに設定する必要があるこの XSLT を見てください。

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="utf-8"/>

  <xsl:param name="XML">
    <info>abcdefghijklmnopqrstuvwxyz01234567890abcdefghijklmnopqrstuvwxyz01234567890</info>
  </xsl:param>
  <xsl:param name="stringRequired" select="xs:integer(13)"/>
  <xsl:param name="XMLLenfgh" select="string-length($XML)"/>
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="$XMLLenfgh gt $stringRequired">
        <xsl:call-template name="getPart"/>
      </xsl:when>
      <xsl:otherwise>
        <T31>
          <x>
            <xsl:value-of select="$XML/info"/>
          </x>
        </T31>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="getPart">
    <xsl:param name="XML" select="$XML"/>
    <xsl:param name="stringRequired" select="$stringRequired"/>
    <xsl:param name="XMLLenfgh" select="$XMLLenfgh"/>
    <xsl:message>
      <xsl:value-of select="$XML"/>
    </xsl:message>
    <xsl:if test="$XMLLenfgh gt $stringRequired">
      <T>
        <x>
          <xsl:value-of select="substring($XML,1,$stringRequired)"/>
        </x>
      </T>
      <xsl:call-template name="getPart">
        <xsl:with-param name="XML"
          select="substring($XML,string-length(substring($XML,1,$stringRequired)))"/>
        <xsl:with-param name="XMLLenfgh"
          select="string-length(substring($XML,string-length(substring($XML,1,$stringRequired))))"/>
        <xsl:with-param name="stringRequired" select="$stringRequired"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

出力:

<T xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <x>abcdefghijklm</x>
</T>
<T xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <x>mnopqrstuvwxy</x>
</T>
<T xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <x>yz01234567890</x>
</T>
<T xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <x>0abcdefghijkl</x>
</T>
<T xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <x>lmnopqrstuvwx</x>
</T>
<T xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <x>xyz0123456789</x>
</T>
于 2013-05-15T13:59:19.983 に答える