xsl-list
[Top] [All Lists]

Re: [xsl] Creating Nested Structure Based on Attributes

2007-03-19 04:14:12
Jeff Sese wrote:

<inline font-style="italic" font-variant="small-caps" font-weight="bold" vertical-alignment="superscript">text</inline>


Hi Jeff,

David Carlisle already showed you how to do it in XSLT 1.0 with mode switching. I don't know if you have the possibility to use XSLT 2.0, but here's a solution that does the same in XSLT 2.0, with the help of a little function that turns any range of attributes into a hierarchical node list, making it easier to use with matching templates. It's perhaps a bit non-conventional, but it keeps your code pretty tight.

Output from your source is equal to the requested output.

Happy coding!

-- Abel Braaksma
  http://abelleba.metacarpus.com


<xsl:stylesheet
   xmlns:f="http://function";
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   version="2.0">

   <xsl:output indent="yes" />

   <xsl:template match="inline">
       <xsl:copy>
<xsl:apply-templates select="f:attr-to-nodes-hier(attribute::*, text())" />
       </xsl:copy>
   </xsl:template>

   <!-- result from f:attr-to-nodes-hier -->
   <xsl:template match="attr">
       <emphasis format="{(_at_)value}">
           <xsl:apply-templates select="node()" />
       </emphasis>
   </xsl:template>
<!-- result from f:attr-to-nodes-hier -->
   <xsl:template match="attr[(_at_)name = 'vertical-alignment']">
       <superscript>
           <xsl:apply-templates select="node()" />
       </superscript>
   </xsl:template>
<xsl:function name="f:attr-to-nodes-hier" as="node()*">
       <xsl:param name="attributes" as="attribute()*" />
       <xsl:param name="text" as="text()" />
       <xsl:if test="$attributes">
           <attr name="{$attributes[1]/name()}" value="{$attributes[1]}">
<xsl:copy-of select="f:attr-to-nodes-hier($attributes[position() > 1], $text)" />
           </attr>
       </xsl:if>
       <xsl:if test="empty($attributes)">
           <xsl:sequence select="$text" />
</xsl:if> </xsl:function>
</xsl:stylesheet>

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>