xsl-list
[Top] [All Lists]

RE: Reassinging attribute values

2006-01-11 06:24:03
You can't modify a tree. You have to copy the tree, modifying the attributes
as you go, so the attributes in the new tree are different from those in the
old. You can process a document in the usual way, a recursive descent using
xsl:apply-templates, extended so that it applies templates to attributes as
well as children; and then you simply need to define a template rule for the
attribute you want to modify that contains the necessary logic.

There's nothing wrong with the template rule you showed us, by the way; the
problem is in the way it gets invoked. Attributes of a constructed element
must be generated before the children of that element, so you can call this
template rule like this:

<newElement>
  <xsl:apply-templates select="topic"/>
  <childElement/>
</newElement>

but not like this:

<newElement>
  <childElement/>
  <xsl:apply-templates select="topic"/>
</newElement>

Michael Kay
http://www.saxonica.com/



-----Original Message-----
From: Cindy Hunt [mailto:Cindy(_dot_)Hunt(_at_)sas(_dot_)com] 
Sent: 11 January 2006 13:10
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Reassinging attribute values

In the effort to deal with our ID values not being unique 
across a document, I am having to do some manipulation to the 
ID values to get my link anchors and targets matching up 
correctly. Many of our larger element types have what we call 
an eid on them which is just an ID like so:

<topic eid="1234">

Because I need to make all of these unique while I transform 
a document, I am pretty much tacking on information to the 
front of the ID. Then I would like to reassign the old eid= 
with my newly created value.

Here's what I was trying to do:

<xsl:template match="topic">
   <xsl:variable name="newId" select="string manipulation to 
get it how I want via checking xml:base, etc."/>
   <xsl:attribute name="eid">{$newId}</xsl:attribute>
</xsl:template>

Unfortunately, the Saxon parser doesn't allow the 
xsl:attribute to be there. I get an error saying SYNTAX 
WARNING::Cannot write an attribute node when no element start 
tag is open. After doing some reading it seems like the 
xsl:attribute and xsl:element tags only change these values 
in the output document which I assume is for when you want to 
do an XSL->XSL transformation. This isn't what I want so I 
guess I need to find an alternative way to reassign the eid 
attribute value.

If you saw my post yesterday title "Need assistance with 
match string", this all relates. In that post, I was 
massaging the eid used on the link anchor and in this one I 
am trying to massage in on the link target in hopes that they 
will both match and I can return the title of the topic. This 
output of this transform is actually FO and I am not having 
trouble with creating the link in FO (assigning the 
fo:block's id to my $newId and creating an fo:basic-link to 
that location and getting the correct fo:page-number-citation 
returned for my cross-reference) but I am unable to grab the 
title based on this massaged new eid value.

So basically I am looking for a way to change an attribute 
value in the tree while I am processing the document. Is 
there any way to do this?

Any suggestions would be greatly appreciated.

Thanks,
Cindy Hunt



--~------------------------------------------------------------------
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>
--~--





--~------------------------------------------------------------------
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>