0
votes

Please help to write xsl:

I've got this xml:

<?xml version="1.0" encoding="utf-8"?>
<root>
<Table name = "My table1">
<Row isHeader="True">
<Cell val ="Header1"> </Cell>
<Cell val ="Header2"> </Cell>
<Cell val ="Header3"> </Cell>
</Row>
<Row isHeader="False">
<Cell val ="Data2.1"> </Cell>
<Cell val ="Data2.2"> </Cell>
<Cell val ="Data2.3"> </Cell>
</Row>
<Row>
<Cell val ="Data3.1"> </Cell>
<Cell val ="Data3.2"> </Cell>
<Cell val ="Data3.3"> </Cell>
</Row>
</Table>
</root>

to this output: First row contains headers.

<?xml version="1.0" encoding="utf-8"?>
<items>
<item>Header1=Data2.1 Header2=Data2.2 Header3=Data2.3 </item>
<item>Header1=Data3.1 Header2=Data3.2 Header3=Data3.3 </item>
</items>

Many thanks for your help!

2
It appears that the input XML is not written in this question, assuming the output XML is the code in the box below "to output:" - qxotk
sorry! source xml here! - user2896623

2 Answers

1
votes

Here is my suggestion:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:template match="Table">
  <items>
    <xsl:variable name="headers" select="Row[1]/Cell/@val"/>
    <xsl:for-each select="Row[position() gt 1]">
      <item>
        <xsl:for-each select="Cell">
          <xsl:if test="position() gt 1"><xsl:text> </xsl:text></xsl:if>
          <xsl:variable name="pos" select="position()"/>
          <xsl:value-of select="concat($headers[$pos], '=', @val)"/>
        </xsl:for-each>
      </item>
    </xsl:for-each>
  </items>
</xsl:template>

</xsl:stylesheet>
0
votes
<xsl:template match="Table">
 <xsl:variable name='headers' select="Row[1]"/>
 <xsl:for-each select="remove(Row, 1)">
   <item><xsl:value-of 
            select="for $i in 1 to count($headers/Cell) 
                    return concat($headers/Cell[$i], '=', Cell[$i])"/>
   </item>
 </xsl:for-each>
</xsl:template>

Not tested.