创建通用xslt以输出xsl xml时遇到问题

时间:2014-12-04 19:38:35

标签: xml excel xslt

我有一个以下xml文件,我想将其转换为xsl而不对“table”元素下的元素进行硬编码,因为不同文件中的单元格不能更多:

<Data>
  <Table>
    <cell1>val1</cell1>
    <cell2>val2</cell2>
    <cell3 />
    <cell4>val3</cell4>
    <cell5>val4</cell5>
  </Table>
  <Table>
    <cell1>vala</cell1>
    <cell2>valB</cell2>
    <cell3>valC</cell3>
    <cell4></cell4>
    <cell5></cell5>
  </Table>
</Data>

问题我面临两个问题: 1)迭代表[1]的元素以创建标题 2)使用值

创建每一行

这是我所拥有的xslt,它没有给出欲望结果:

<Worksheet ss:Name="Sheet1">
  <Table>
    <Row>
      <Cell>
        Header
      </Cell>
    </Row>
    <Row>
      <Cell/>
      <xsl:variable name="set" select="/Data/Table[1]" />
      <xsl:for-each select="$set">
        <Cell ss:StyleID="header">
          <Data ss:Type="string">
            <xsl:value-of select="name(.)"/>
          </Data>
        </Cell>
      </xsl:for-each>
    </Row>
    <xsl:for-each select="/Data/Table/.">
      <Row>
        <Cell ss:StyleID="header">
          <Data ss:Type="String">
            <xsl:value-of select="."/>
          </Data>
        </Cell>
      </Row>
    </xsl:for-each>
  </Table>
</Worksheet>

它没有像下面这样创建所需的结果xml:

<Row>
  <Cell ss:StyleID="header">
    <Data ss:Type="string">cell1</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="string">cell2</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="string">cell3</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="string">cell4</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="string">cell5</Data>
  </Cell>
</Row>
<Row>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">val1</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">val2</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String"></Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">val4</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">val5</Data>
  </Cell>
</Row>
<Row>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">vala</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">valB</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String">valC</Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String"></Data>
  </Cell>
  <Cell ss:StyleID="header">
    <Data ss:Type="String"></Data>
  </Cell>
</Row>

1 个答案:

答案 0 :(得分:1)

我不确定您希望在XSLT开头使用

作为静态标头的输出。
<Table>
<Row>
  <Cell>
    Header
  </Cell>
</Row>
....

但是对于相关部分:如果你改为

<Row>
  <Cell/>
  <xsl:variable name="set" select="/Data/Table[1]" />
  <xsl:for-each select="$set/*">
    <Cell ss:StyleID="header">
      <Data ss:Type="string">
        <xsl:value-of select="name(.)"/>
      </Data>
    </Cell>
  </xsl:for-each>
</Row>
<xsl:for-each select="/Data/Table/.">
  <Row>
  <xsl:for-each select="./*">
    <Cell ss:StyleID="header">
      <Data ss:Type="String">
        <xsl:value-of select="."/>
      </Data>
    </Cell>
    </xsl:for-each>
  </Row>
</xsl:for-each>

输出

<Row>
     <Cell></Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="string">cell1</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="string">cell2</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="string">cell3</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="string">cell4</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="string">cell5</Data>
     </Cell>
  </Row>
  <Row>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">val1</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">val2</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String"></Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">val3</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">val4</Data>
     </Cell>
  </Row>
  <Row>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">vala</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">valB</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String">valC</Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String"></Data>
     </Cell>
     <Cell ss:StyleID="header">
        <Data ss:Type="String"></Data>
     </Cell>
  </Row>

在你的XSLT中的部分

<xsl:variable name="set" select="/Data/Table[1]" />
  <xsl:for-each select="$set">
     <Cell ss:StyleID="header">
     ...

只为第一个表生成一个单元格,而不是为表格的每个单元格生成一个单元格。

同样适用于

<xsl:for-each select="/Data/Table/.">
  <Row>
    <Cell ss:StyleID="header">
     ...

其中只为每个表创建一个包含一个单元格的行。