Reputation: 135
For-each of a collection of headers and find a certain attribute in another collection of Items. If I have something like:
<ROOT>
<Listings>
<Listing>
<Headers>
<Header width="3cm" value="UserName" />
<Header width="3cm" value="MobileAlias" />
<Header width="3cm" value="Name" />
<Header width="3cm" value="Email" />
<Header width="1cm" value="Gender" />
<Header width="2cm" value="LastLoginDate" />
<Header width="2cm" value="LastActivityDate" />
<Header width="1.5cm" value="IsApproved" />
<Header width="1.5cm" value="IsLockedOut" />
</Headers>
<Footers></Footers>
<Items>
<Item UserName="Admin" MobileAlias="Admin" Name="Systems Administrator" Email="[email protected]" Gender="Male" LastLoginDate="29-07-2009 12:54:59" LastActivityDate="29-07-2009 12:56:37" IsApproved="True" IsLockedOut="False" />
<Item UserName="Guest" MobileAlias="Guest" Name="Anonymous User" Email="[email protected]" Gender="Male" LastLoginDate="" LastActivityDate="" IsApproved="True" IsLockedOut="False" />
</Items>
</Listing>
</Listings>
</ROOT>
How can I get something like:
<fo:table-row>
<fo:table-cell><fo:block>Admin</fo:block></fo:table-cell>
<fo:table-cell><fo:block>Admin</fo:block></fo:table-cell>
<fo:table-cell><fo:block>System Administrator</fo:block></fo:table-cell>
<fo:table-cell><fo:block>[email protected]</fo:block></fo:table-cell>
<fo:table-cell><fo:block>Male</fo:block></fo:table-cell>
<fo:table-cell><fo:block>29-07-2009 12:54:59</fo:block></fo:table-cell>
<fo:table-cell><fo:block>29-07-2009 12:56:37</fo:block></fo:table-cell>
<fo:table-cell><fo:block>True</fo:block></fo:table-cell>
<fo:table-cell><fo:block>True</fo:block></fo:table-cell>
</fo:table-row>
(...)
I mean, for-each Item in Items, for-each Header in Headers, return the attribute Header@value from Item
Much appreciated.
Upvotes: 2
Views: 1965
Reputation: 338248
I recommend using separate templates for increased maintainability. The following is basically what AnthonyWJones did, but adapted to your input:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
>
<xsl:output method='xml' indent="yes" />
<!-- <Listing> elements become tables -->
<xsl:template match="Listing">
<fo:table>
<xsl:apply-templates />
</fo:table>
</xsl:template>
<!-- <Items> elements become table rows -->
<xsl:template match="Items">
<fo:table-row>
<xsl:apply-templates />
</fo:table-row>
</xsl:template>
<!-- applies the correct order to the output -->
<xsl:template match="Item">
<fo:table-row>
<xsl:variable name="this" select="." />
<xsl:for-each select="../../Headers/Header">
<xsl:apply-templates select="$this/@*[name() = current()/@value]" />
</xsl:for-each>
</fo:table-row>
</xsl:template>
<!-- <Item> attributes become table cells -->
<xsl:template match="Item/@*">
<fo:table-cell>
<fo:block>
<xsl:value-of select="." />
</fo:block>
</fo:table-cell>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
Upvotes: 3
Reputation: 189457
I don't know xsl-fo but that isn't relevant. Here is a simple example generating a HTML table:-
<xsl:template match="/ROOT">
<table rules="all">
<xsl:for-each select="Listings/Listing/Items/Item">
<xsl:variable name="item" select="." />
<tr>
<xsl:for-each select="/ROOT/Listings/Listing/Headers/Header">
<td><xsl:value-of select="$item/@*[local-name()=current()/@value]" /></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
Upvotes: 2