Matching attribute names to element names in a different path

C

Carl

I want to create a generic xslt that would take xml input like:

##########################################################################
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="lookup.xslt"?>
<root>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="lookup" content="empty" model="closed">
<AttributeType name="col1" dt:type="i2"/>
<AttributeType name="col2" dt:type="i2"/>
<AttributeType name="col3" dt:type="i2"/>
<AttributeType name="col4 dt:type="i2"/>
<AttributeType name="col5 dt:type="i2"/>
<attribute type="col1"/>
<attribute type="col2"/>
<attribute type="col3"/>
<attribute type="col4/>
<attribute type="col5>
</ElementType>
</Schema>
<lookup xmlns="x-schema:#Schema1" col1="a" col2="b" col3="c"/>
<lookup xmlns="x-schema:#Schema1" col1="d" col3="e" />
</root>
##########################################################################

and turn it into a table with col1, col2, col3, col4 and col5 as
headings
and with the data it will put "a" in col1, "b" in col2 etc.

The problem is that, because column 4 has no data in the elements,
that column is not generated in the table.

So I am using the Schema to generate the column headings, but now I
have to match the data to the correct columns... I can onnly do that
by matching the attribute names to the corresponding element name in
the schema declaration. But I don't know how to do this...

Here is my attempt. Any help would be greatly appreciated. Thanks in
advance.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:data="x-schema:#Schema1"
xmlns:schema="urn:schemas-microsoft-com:xml-data">
<xsl:template match="/root">
<TABLE>
<xsl:apply-templates select="schema:Schema" /> <!-- headings -->
<xsl:apply-templates select="data:lookup" /> <!-- data -->
</TABLE>
</xsl:template>

<xsl:template match="schema:Schema">
<tr style="color:White;background-color:Blue;">
<td></td>
<xsl:for-each select="*/*"><!-- Select all the elements of the
schema-->
<xsl:if test="name(.)='AttributeType' and position() != 1"><!--
only pick the AttributeType elements, otherwise you will have the
columns twice -->
<xsl:for-each select="@name">
<td>
<xsl:attribute name="name"><xsl:value-of
select="name()"/></xsl:attribute>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
<td></td>
</tr>
</xsl:template>

<!-- lookup Template -->
<xsl:template match="data:lookup">
<tr>
<td></td>
<xsl:for-each select="@*">
<td>
<xsl:value-of select="." />
</td>
</xsl:for-each>
<td></td>
</tr>
</xsl:template>
</xsl:stylesheet>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top