XSL:使用xsl将xml转换为输出

时间:2013-10-18 23:31:38

标签: xslt xslt-2.0

请帮忙写xsl:

我有这个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>

到此输出:第一行包含标题。

<?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>

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

这是我的建议:

<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>

答案 1 :(得分:0)

<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>

未经测试。

相关问题