Re: [xsl] XSLT 2: Best Way to Synthesize Elements Given List of Tagnames

Subject: Re: [xsl] XSLT 2: Best Way to Synthesize Elements Given List of Tagnames
From: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 5 Nov 2016 17:01:25 -0000
That's very clever. I'm not sure it's clearer than my current recursive
solution though :-)

Cheers,

E.
--
Eliot Kimber
http://contrext.com
 






On 11/5/16, 11:49 AM, "Dimitre Novatchev dnovatchev@xxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

>I'd suggest this non-recursive solution:
>
><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="pPath" select="'/foo/bar/baz/bam/bak/bap/bah/baw'"/>
>
> <xsl:variable name="vNames" select="tokenize($pPath, '/')[.]"/>
>
>  <xsl:template match="*[count(current()/ancestor::*) lt count($vNames)]">
>    <xsl:element name="{$vNames[count(current()/ancestor::node())]}">
>      <xsl:apply-templates select="*"/>
>    </xsl:element>
>  </xsl:template>
>
>  <xsl:template match="text()"/>
></xsl:stylesheet>
>
>
>When applied on:
>
><x1>
> <x2>
>  <x3>
>   <x4>
>    <x5>
>     <x6>
>      <x7>
>       <x8>
>        <x9>
>         <x10>
>          <x11>
>           <x12>
>            <x13>
>             <x14>
>              <x15>
>               <x16>
>                <x17>
>                 <x18>
>                  <x19>
>                   <x20>
>                   </x20>
>                  </x19>
>                 </x18>
>                </x17>
>               </x16>
>              </x15>
>             </x14>
>            </x13>
>           </x12>
>          </x11>
>         </x10>
>        </x9>
>       </x8>
>      </x7>
>     </x6>
>    </x5>
>   </x4>
>  </x3>
> </x2>
></x1>
>
>the result is:
>
><foo>
>   <bar>
>      <baz>
>         <bam>
>            <bak>
>               <bap>
>                  <bah>
>                     <baw/>
>                  </bah>
>               </bap>
>            </bak>
>         </bam>
>      </baz>
>   </bar>
></foo>
>
>
>Cheers,
>Dimitre
>
>On Sat, Nov 5, 2016 at 9:18 AM, Eliot Kimber ekimber@xxxxxxxxxxxx
><xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>> Say I have this string: "foo/bar" (or any arbitrarily-long sequence of
>> /-delimited tag names) and want to construct from it:
>>
>> <foo>
>>   <bar>
>>     <!-- Stuff added here that I get from somewhere else -->
>>   </bar>
>> </foo>
>>
>> Is there an easier or more obvious way to generate this than an
>>recursive
>> function?
>>
>> With a recursive function I can easily create child elements until the
>> sequence is exhausted but it feels like there should be an easier way
>> using XSLT 2 but if there is I'm not thinking of it.
>>
>> Cheers,
>>
>> Eliot
>>
>> --
>> Eliot Kimber
>> http://contrext.com
>>
>>
>>
>>
>> 
>
>
>
>-- 
>Cheers,
>Dimitre Novatchev
>---------------------------------------
>Truly great madness cannot be achieved without significant intelligence.
>---------------------------------------
>To invent, you need a good imagination and a pile of junk
>-------------------------------------
>Never fight an inanimate object
>-------------------------------------
>To avoid situations in which you might make mistakes may be the
>biggest mistake of all
>------------------------------------
>Quality means doing it right when no one is looking.
>-------------------------------------
>You've achieved success in your field when you don't know whether what
>you're doing is work or play
>-------------------------------------
>To achieve the impossible dream, try going to sleep.
>-------------------------------------
>Facts do not cease to exist because they are ignored.
>-------------------------------------
>Typing monkeys will write all Shakespeare's works in 200yrs.Will they
>write all patents, too? :)
>-------------------------------------
>Sanity is madness put to good use.
>-------------------------------------
>I finally figured out the only reason to be alive is to enjoy it.

Current Thread