How do I correctly select XML data while using "position()"?

Viewed 33

I have an XML file:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <alert>
        <alertid><![CDATA[1234]]></alertid>
    </alert>
    <MyData>
        <ConfigData Name="tableheader">TmpTable</ConfigData>
        <ConfigData Name="tablelines">TmpTrans</ConfigData>
        <Table:Record Name="TmpTable" xmlns:Table="urn:mysite.com:EventData">
            <Table:ConfigData Name="Config1">SomeData</Table:ConfigData>
            <Table:ConfigData Name="Config2">SomeOtherData</Table:ConfigData>
            <Table:Field Name="Field1" LabelString="Field 1">Field 1 Value</Table:Field>
            <Table:Field Name="Field2" LabelString="Field 2">Field 2 Value</Table:Field>
            <Table:Field Name="Field3" LabelString="Field 3">Field 3 Value</Table:Field>
            <Table:Field Name="Field4" LabelString="Field 4">Field 4 Value</Table:Field>
            
            <Table:Record Name="TmpTrans">
                <Table:Field Name="TransField1" LabelString="TransField 1">Trans Field 1 Value</Table:Field>
                <Table:Field Name="TransField2" LabelString="TransField 2">Trans Field 2 Value</Table:Field>
                <Table:Field Name="TransField3" LabelString="TransField 3">Trans Field 3 Value</Table:Field>
                <Table:Field Name="TransField4" LabelString="TransField 4">Trans Field 4 Value</Table:Field>
            </Table:Record>
        </Table:Record>
        <Table:Record Name="Misc" xmlns:Table="urn:mysite.com:EventData">
            <Table:Field Name="Ident">321</Table:Field>
            <Table:Field Name="Name">Name</Table:Field>
            <Table:Field Name="Path">Path</Table:Field>
        </Table:Record>
    </MyData>
</Root>

With this XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:Table="urn:mysite.com:EventData">
    <xsl:output method="html"/>
    <xsl:param name="pNumCols" select="2"/>
    <xsl:template match="/*">
        <html>
            <body>
            <table>
                <xsl:apply-templates select="Root/MyData/Table:Record[@Name='TmpTable'][position() mod $pNumCols = 1]"/>
            </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="Root/MyData/Table:Record[@Name='TmpTable']">
        <tr>
            <xsl:apply-templates mode="copy" select=". | following-sibling::*[not(position() >= $pNumCols)]"/>
        </tr>
    </xsl:template>
    <xsl:template match="Root/MyData/Table:Record[@Name='TmpTable']" mode="copy">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>
</xsl:stylesheet>

And I'm trying to get an output that looks like this, currently only focusing on the top section, not "details" yet:

Sample Table

    <table border="1" cellpadding="4" cellspacing="1">
        <tr>
            <th>Field 1</th>
            <td>Field 1 Value</td>
            <th>Field 2</th>
            <td>Field 2 Value</td>
        </tr>
        <tr>
            <th>Field 3</th>
            <td>Field 3 Value</td>
            <th>Field 4</th>
            <td>Field 4 Value</td>
        </tr>
        <tr>
            <th>Details</th>
            <td colspan="100%">
                <table border="1" cellpadding="4" cellspacing="1">
                    <tr>
                        <th>TransField 1</th>
                        <th>TransField 2</th>
                        <th>TransField 3</th>
                        <th>TransField 4</th>
                    </tr>
                    <tr>
                        <td>Trans Field 1 Value</td>
                        <td>Trans Field 2 Value</td>
                        <td>Trans Field 3 Value</td>
                        <td>Trans Field 4 Value</td>
                    </tr>
                </table>
            </td>
        </tr>
        </tbody>
    </table>

Question: I'm following this post - xsl: transforming a list into a 2-D table but I'm having trouble selecting and matching my records.

Where am I going wrong? I believe I'm confined to XSLT 1.0

0 Answers
Related