【问题标题】:Styling excel cells using xlst使用 xslt 为 excel 单元格设置样式
【发布时间】:2012-11-20 12:51:30
【问题描述】:

我有一个xml

<?xml version="1.0"?>
    <ArrayOfSubscriber xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Subscriber>
        <FirstName xsi:nil="true" xmlns="somenamespace" />
        <LastName xsi:nil="true" xmlns="somenamespace" />
        ...
      </Subscriber>
...
</ArrayOfSubscriber>

我需要创建一个 Excel 文件,其中每一列都有自己的样式。我希望通过下一次转换得到我期望的结果

<Worksheet>
  <Table>
    <xsl:apply-templates select="//Subscriber" />
  </Table>
</Worksheet>

<xsl:template match="Subscriber">
  <Row ss:Height="15">
    <Cell ss:StyleID="s21">
      <Data ss:Type="String">
        <xsl:value-of select="FirstName" />
      </Data>
    </Cell>
    <Cell ss:StyleID="s22">
      <Data ss:Type="String">
        <xsl:value-of select="LastName " />
      </Data>
    </Cell>
    ...
   </Row>
</xsl:template>

但由于命名空间xmlns="somenamespace" 而出现问题。因此我无法获取数据。我发现了一些主题,其中描述了删除它们的可能性,但就我 xslt 的新手而言,我没有成功地将正确的模板应用于我的任务。

【问题讨论】:

标签: xml excel xslt


【解决方案1】:

使用与此类似的构造尝试我之前链接到的帖子中的替代方法:

<xsl:value-of select="*[local-name()='FirstName' = and namespace-uri()='somenamespace']" />

之前建议将命名空间定义为父元素:

<parent xmlns:sn="somenamespace">
...
<xsl:template match="Subscriber">
  <Row ss:Height="15">
    <Cell ss:StyleID="s21">
      <Data ss:Type="String">
        <xsl:value-of select="sn:FirstName" />
      </Data>
    </Cell>
    <Cell ss:StyleID="s22">
      <Data ss:Type="String">
        <xsl:value-of select="sn:LastName " />
      </Data>
    </Cell>
    ...
   </Row>
</xsl:template>
...
</parent>

【讨论】:

  • 如果在工作簿的标签级别上定义sn,您将收到错误消息。如果在xsl:stylesheet 内执行此操作将起作用。但问题是我不想把命名空间放在这里。这意味着我应该记住这一点,而命名空间的每一次变化。还有其他方法吗?
  • 在最高级别声明命名空间可能是个好主意,因为这将使您的文档更具可读性且不易出错。在同一个文档中多次重申同一个命名空间声明通常是不好的气味
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多