XSLT string

I have XML with node text, and I need to split this string into multiple fragments using XSLT 2.0. For instance:

<tag>
    <text>This is a long string 1This is a long string 2This is a long string 3This is a long string 4</text>
</tag>

The output should be:

<tag>
    <text>This is a long string 1</text>
    <text>This is a long string 2</text>
    <text>This is a long string 3</text>
    <text>This is a long string 4</text>
</tag>

Please note that I intentionally set the fragment size to the length of each statement, so that this example is easier to read and write, but the transformation should take any value (this is normal so that this value is hard-coded).

0
source share
1 answer

Convert XSLT 1.0 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pChunkSize" select="23"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text/text()" name="chunk">
  <xsl:param name="pText" select="."/>

  <xsl:if test="string-length($pText) >0">
   <text><xsl:value-of select=
   "substring($pText, 1, $pChunkSize)"/>
   </text>
   <xsl:call-template name="chunk">
    <xsl:with-param name="pText"
    select="substring($pText, $pChunkSize+1)"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

when applied to the provided XML document :

<tag>
    <text>This is a long string 1This is a long string 2This is a long string 3This is a long string 4</text>
</tag>

creates the desired, correct result :

<tag>
    <text>
        <text>This is a long string 1</text>
        <text>This is a long string 2</text>
        <text>This is a long string 3</text>
        <text>This is a long string 4</text>
        <text/>
    </text>
</tag>

II. XSLT 2.0 solution (non-recursive):

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pChunkSize" select="23"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text/text()">
  <xsl:variable name="vtheText" select="."/>
  <xsl:for-each select=
      "0 to string-length() idiv $pChunkSize">
   <text>
    <xsl:sequence select=
     "substring($vtheText, . *$pChunkSize +1, $pChunkSize) "/>
   </text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
+1

Source: https://habr.com/ru/post/1544688/


All Articles