merging two sequences in xslt

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • JMan

    merging two sequences in xslt

    Hi,
    i have some xml that looks like this:

    <parent>
    <a>1,2,3,4,5,6, 7,8</a>
    <b>a,b,c,d,e,f, g,h</b>
    </parent>

    what i need i this:
    <parent>
    <ab>a 1 b 2 c 3 d 4 ...</ab>
    </parent>

    How can i do this? I thought of tokenizing the values of <aand <b>
    into sequences, but i dont know how to merge them together.
    Does anybody has a solution to this problem?

    cheers, Johannes
  • dahu

    #2
    Re: merging two sequences in xslt

    May be using fn:string-join ?

    fn:string-join: Concatenates a sequence of strings using an optional separator


    JMan wrote:
    Hi,
    i have some xml that looks like this:
    >
    <parent>
    <a>1,2,3,4,5,6, 7,8</a>
    <b>a,b,c,d,e,f, g,h</b>
    </parent>
    >
    what i need i this:
    <parent>
    <ab>a 1 b 2 c 3 d 4 ...</ab>
    </parent>
    >
    How can i do this? I thought of tokenizing the values of <aand <b>
    into sequences, but i dont know how to merge them together.
    Does anybody has a solution to this problem?
    >
    cheers, Johannes

    Comment

    • JMan

      #3
      Re: merging two sequences in xslt

      Well, to use fn:string join i would still need to first merge the two
      sequences together wouldn't i?

      cheers, Johannes

      On 15 Okt., 16:42, dahu <d...@dahu.frwr ote:
      May be using fn:string-join ?
      >
      fn:string-join: Concatenates a sequence of strings using an optional separator

      >
      JMan wrote:
      Hi,
      i have some xml that looks like this:
      >
      <parent>
      <a>1,2,3,4,5,6, 7,8</a>
      <b>a,b,c,d,e,f, g,h</b>
      </parent>
      >
      what i need i this:
      <parent>
      <ab>a 1 b 2 c 3 d 4 ...</ab>
      </parent>
      >
      How can i do this? I thought of tokenizing the values of <aand <b>
      into sequences, but i dont know how to merge them together.
      Does anybody has a solution to this problem?
      >
      cheers, Johannes

      Comment

      • Martin Honnen

        #4
        Re: merging two sequences in xslt

        JMan wrote:
        Hi,
        i have some xml that looks like this:
        >
        <parent>
        <a>1,2,3,4,5,6, 7,8</a>
        <b>a,b,c,d,e,f, g,h</b>
        </parent>
        >
        what i need i this:
        <parent>
        <ab>a 1 b 2 c 3 d 4 ...</ab>
        </parent>
        >
        How can i do this? I thought of tokenizing the values of <aand <b>
        into sequences, but i dont know how to merge them together.

        <xsl:styleshe et
        xmlns:xsl="http ://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">

        <xsl:template match="parent">
        <xsl:copy>
        <xsl:variable name="l1" as="xs:string* " select="tokeniz e(a, ',')"/>
        <xsl:variable name="l2" as="xs:string* " select="tokeniz e(b, ',')"/>
        <ab>
        <xsl:value-of select="for $p in 1 to count($l1) return
        ($l2[$p], $l1[$p])" separator=" "/>
        </ab>
        </xsl:copy>
        </xsl:template>

        </xsl:stylesheet>



        --

        Martin Honnen

        Comment

        • JMan

          #5
          Re: merging two sequences in xslt

          Hi Martin,

          thanks for your reply. Its actually not yet working for me. l1 and l2
          are of count==1 so what i get is pretty much what i put in. There
          seems to be a problem with assiging the sequences to the veriables.
          Can you fix it?

          thanks, Johannes
          JMan wrote:
          Hi,
          i have some xml that looks like this:
          >
          <parent>
          <a>1,2,3,4,5,6, 7,8</a>
          <b>a,b,c,d,e,f, g,h</b>
          </parent>
          >
          what i need i this:
          <parent>
          <ab>a 1 b 2 c 3 d 4 ...</ab>
          </parent>
          >
          How can i do this? I thought of tokenizing the values of <aand <b>
          into sequences, but i dont know how to merge them together.
          >
          <xsl:styleshe et
             xmlns:xsl="http ://www.w3.org/1999/XSL/Transform"
             xmlns:xs="http://www.w3.org/2001/XMLSchema"
             exclude-result-prefixes="xs"
             version="2.0">
          >
             <xsl:template match="parent">
               <xsl:copy>
                 <xsl:variable name="l1" as="xs:string* " select="tokeniz e(a, ',')"/>
                 <xsl:variable name="l2" as="xs:string* " select="tokeniz e(b, ',')"/>
                 <ab>
                   <xsl:value-of select="for $p in 1 to count($l1) return
          ($l2[$p], $l1[$p])" separator=" "/>
                 </ab>
               </xsl:copy>
             </xsl:template>
          >
          </xsl:stylesheet>
          >
          --
          >
                  Martin Honnen
                 http://JavaScript.FAQTs.com/

          Comment

          • JMan

            #6
            Re: merging two sequences in xslt

            Martin!
            thanks alot!

            cheers, Johannes

            On 15 Okt., 17:02, Martin Honnen <mahotr...@yaho o.dewrote:
            JMan wrote:
            Hi,
            i have some xml that looks like this:
            >
            <parent>
            <a>1,2,3,4,5,6, 7,8</a>
            <b>a,b,c,d,e,f, g,h</b>
            </parent>
            >
            what i need i this:
            <parent>
            <ab>a 1 b 2 c 3 d 4 ...</ab>
            </parent>
            >
            How can i do this? I thought of tokenizing the values of <aand <b>
            into sequences, but i dont know how to merge them together.
            >
            <xsl:styleshe et
               xmlns:xsl="http ://www.w3.org/1999/XSL/Transform"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               exclude-result-prefixes="xs"
               version="2.0">
            >
               <xsl:template match="parent">
                 <xsl:copy>
                   <xsl:variable name="l1" as="xs:string* " select="tokeniz e(a, ',')"/>
                   <xsl:variable name="l2" as="xs:string* " select="tokeniz e(b, ',')"/>
                   <ab>
                     <xsl:value-of select="for $p in 1 to count($l1) return
            ($l2[$p], $l1[$p])" separator=" "/>
                   </ab>
                 </xsl:copy>
               </xsl:template>
            >
            </xsl:stylesheet>
            >
            --
            >
                    Martin Honnen
                   http://JavaScript.FAQTs.com/

            Comment

            • JMan

              #7
              Re: merging two sequences in xslt

              can i change the datatypes of the lists, so that i can do something
              like
              <xsl:value-of select="for $p in 1 to count($l1) return ($l2[$p] div
              10 , $l1[$p] div 10)" separator=" "/?

              cheers, Johannes

              On 15 Okt., 18:09, JMan <JohannesElsing ho...@gmail.com wrote:
              Martin!
              thanks alot!
              >
              cheers, Johannes
              >
              On 15 Okt., 17:02, Martin Honnen <mahotr...@yaho o.dewrote:
              >
              JMan wrote:
              Hi,
              i have some xml that looks like this:
              >
              <parent>
              <a>1,2,3,4,5,6, 7,8</a>
              <b>a,b,c,d,e,f, g,h</b>
              </parent>
              >
              what i need i this:
              <parent>
              <ab>a 1 b 2 c 3 d 4 ...</ab>
              </parent>
              >
              How can i do this? I thought of tokenizing the values of <aand <b>
              into sequences, but i dont know how to merge them together.
              >
              <xsl:styleshe et
                 xmlns:xsl="http ://www.w3.org/1999/XSL/Transform"
                 xmlns:xs="http://www.w3.org/2001/XMLSchema"
                 exclude-result-prefixes="xs"
                 version="2.0">
              >
                 <xsl:template match="parent">
                   <xsl:copy>
                     <xsl:variable name="l1" as="xs:string* " select="tokeniz e(a, ',')"/>
                     <xsl:variable name="l2" as="xs:string* " select="tokeniz e(b, ',')"/>
                     <ab>
                       <xsl:value-of select="for $p in 1 to count($l1) return
              ($l2[$p], $l1[$p])" separator=" "/>
                     </ab>
                   </xsl:copy>
                 </xsl:template>
              >
              </xsl:stylesheet>
              >
              --
              >
                      Martin Honnen
                     http://JavaScript.FAQTs.com/

              Comment

              • Martin Honnen

                #8
                Re: merging two sequences in xslt

                JMan wrote:
                can i change the datatypes of the lists, so that i can do something
                like
                <xsl:value-of select="for $p in 1 to count($l1) return ($l2[$p] div
                10 , $l1[$p] div 10)" separator=" "/?
                I don't understand how you expect the values a,b,c and so on to be
                treated as numbers.

                However let's assume you have different input data

                <parent>
                <a>1,2,3,4,5,6, 7,8</a>
                <b>10,20,30,40, 50,60,70,80</b>
                </parent>

                then you can of course convert the string sequence the tokenize function
                gives you to a number sequence:

                <xsl:styleshe et
                xmlns:xsl="http ://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs"
                version="2.0">

                <xsl:template match="parent">
                <xsl:copy>
                <xsl:variable name="l1" as="xs:double* " select="for $item in
                tokenize(a, ',') return xs:double($item )"/>
                <xsl:variable name="l2" as="xs:double* " select="for $item in
                tokenize(b, ',') return xs:double($item )"/>
                <ab>
                <xsl:value-of select="for $p in 1 to count($l1) return ($l2[$p]
                div 10, $l1[$p] div 10)" separator=" "/>
                </ab>
                </xsl:copy>
                </xsl:template>

                </xsl:stylesheet>
                --

                Martin Honnen

                Comment

                Working...