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 回答