分裂功能带来麻烦

时间:2013-05-15 13:14:48

标签: xslt-2.0 xpath-2.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>

此结构始终生成完整的字符串。在调试中,我看到它将其拆分,但它将结果连接在一起。我可以以某种方式退出这个功能吗?

最诚挚的问候Dirk

1 个答案:

答案 0 :(得分:1)

请查看此XSLT,您需要将<xsl:param name="stringRequired" select="xs:integer(13)"/>设置为块文本:

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