Re: [xsl] Attribute Matching

Subject: Re: [xsl] Attribute Matching
From: "Karl Stubsjoen" <kstubs@xxxxxxxxx>
Date: Sun, 7 Jan 2007 15:27:56 -0700
Now I'm not sure what I want : )

Your logic, as you have explained makes real good sense. Now looking at this:

<xsl:template match="row">
 <Field flg="{name(@*[.=1])}"/>
</xsl:template>

The context would be row, and then are you proposing to create a new element Field?

I'm feeling stuck but usually there is a way to get this done... let
me explain this another way:

In a single source of XML I have a FIELDS/FIELD lookup, where there
are many FIELD elements which may or may not have a flg attribute
who's value maps to an attribute of the same name in a row element.
The value of this attribute determines whether or not to include the
FIELD element in the result.

So, I'll expand a little with my XML:

<root>
 <fields>
   <field name="Name" flg="flgName"/>
   <field name="HomeTown" flg="flgHomeTown"/>
   <field name="Country" flg="flgCountry"/>
 </fields>
 <result>
   <row flgHomeTown="1" flgCountry="0" flgName="0"/>
   <row flgHomeTown="1" flgCountry="0" flgName="1"/>
 </result>
</root>

The context would be row, and for each row, I need the corresponding
field elements in a variable $drvr.

<xsl:template match="row">
   <xsl:variable name="drvr" select="

      ... return field elements for each attribute of row which maps
to the field collection and is = 1 (this probably just confuses the
objective, but i think you know what i mean) ...


</xsl:template>



On 1/7/07, David Carlisle <davidc@xxxxxxxxx> wrote:

> <xsl:copy-of select="$field[@flg=$drvr/@*[.=name()]]"/>


.=name() is true if the value of the node is the same as its name, so
something like id="id" would test true.

so

$drvr/@*[.=name()]

selects all attributes of the elements in $drvr that have the same name
as their value.

so

@flg=$drvr/@*[.=name()]

is true if there is a flg attribute on the current element that has the
same value as the attribute in $drvr that has the same name as its
value.

It seems like you want something like

<xsl:template match="row">
 <Field flg="{name(@*[.=1])}"/>
</xsl:template>


David

Current Thread