Re: [xsl] add an attribute to an element, then use it in another template

Subject: Re: [xsl] add an attribute to an element, then use it in another template
From: "Vyacheslav Sedov" <vyacheslav.sedov@xxxxxxxxx>
Date: Wed, 5 Mar 2008 16:19:56 +0300
look like your code work as expected - only one notice from me - it
better to use push model instead pull model (or data-driven instead
template-driven)

try use something like <xsl:apply-templates select="bla-bla/@*" mode="pairs">

<xsl:template match="@*" mode="pairs">
       attrName: <xsl:value-of select="name()"/>
       attrValue: <xsl:value-of select="."/>
</xsl:template>

On Wed, Mar 5, 2008 at 3:56 PM, Pablo Sebastian Rodriguez
<psrodriguez@xxxxxxxxxxxxxxxx> wrote:
> wow ! really nice trick ... not quite what i was looking for, but it'll
>  get the job done, thanks.
>  i think i wasn't clear enough
>
>  with
>
>
>  <music>
>
>     <project name="W.A.S.T.E.">
>         <release name="We all seek total entropy" year="2003"/>
>         <release name="Violent delights" year="2006"/>
>     </project>
>
>  </music>
>
>  i get
>
>  attrName: name
>  attrValue: W.A.S.T.E.
>
>
>  if i had
>
>  <music>
>
>     <project name="W.A.S.T.E." newThing="qwertyu">
>
>         <release name="We all seek total entropy" year="2003"/>
>         <release name="Violent delights" year="2006"/>
>     </project>
>
>  </music>
>
>  the result would be
>
>
>  attrName: name
>  attrValue: W.A.S.T.E
>
>  attrName: newThing
>  attrValue: qwertyu
>
>
>  thanks again
>
>
>
>  > In XSLT 2.0 you can do:
>  >
>  > <xsl:template match="music">
>  >      <xsl:call-template name="attr">
>  >           <xsl:with-param name="stuff" select="project"/>
>  >      </xsl:call-template>
>  >      <xsl:call-template name="attr">
>  >           <xsl:with-param name="stuff" as="element()*">
>  >              <project newThing="whoKnowsWhat"/>
>  >              <project adadad="qwertyu"/>
>  >           </xsl:with-param>
>  >      </xsl:call-template
>  > </xsl:template>
>  >
>  > Alternatively you can do a 2-phase transformation: phase one takes the
>  > input
>  > and adds a couple of attributes, phase 2 applies your current logic.
>  >
>  > Michael Kay
>  > http://www.saxonica.com/
>  >
>  >> hi,
>  >> i'm new using xsl, so please be patient... ;-)
>  >>
>  >> the input is something like this:
>  >>
>  >> <music>
>  >>
>  >>     <project name="W.A.S.T.E">
>  >>         <release name="We all seek total entropy" year="2003"/>
>  >>         <release name="Violent delights" year="2006"/>
>  >>     </project>
>  >>
>  >>     <project name="Winterkalte">
>  >>         <release name="Structures of Destruction" year="1997"/>
>  >>         <release name="Drum 'n' noise" year="1999"/>
>  >>     </project>
>  >>
>  >> </music>
>  >>
>  >>
>  >> the xsl:
>  >>
>  >>     <xsl:template match="music">
>  >>         <xsl:call-template name="attr">
>  >>             <xsl:with-param name="stuff" select="project"/>
>  >>         </xsl:call-template>
>  >>     </xsl:template>
>  >>
>  >>     <xsl:template name="attr">
>  >>         <xsl:param name="stuff"/>
>  >>         <xsl:for-each select="$stuff/@*">
>  >>
>  >>         attrName: <xsl:value-of select="name()"/>
>  >>         attrValue: <xsl:value-of select="."/>
>  >>
>  >>         </xsl:for-each>
>  >>     </xsl:template>
>  >>
>  >> the output:
>  >>
>  >> attrName: name
>  >> attrValue: W.A.S.T.E
>  >>
>  >> attrName: name
>  >> attrValue: Winterkalte
>  >>
>  >>
>  >> what i'm trying to do is add an attribute so the output will be:
>  >>
>  >> attrName: newThing
>  >> attrValue: whoKnowsWhat
>  >>
>  >> attrName: name
>  >> attrValue: W.A.S.T.E
>  >>
>  >> attrName: name
>  >> attrValue: Winterkalte
>  >>
>  >> attrName: adadad
>  >> attrValue qwertyu
>  >>
>  >> i tried using <xsl:attribute> but i can't make it work... any ideas ?
>  >>
>  >> thanks

Current Thread