【问题标题】:Transforming MS Office XML转换 MS Office XML
【发布时间】:2013-08-13 12:52:29
【问题描述】:

感谢 Will 我在生成我自己的 XSLT 方面取得了一些进展,但是这个 XML 让我完全陷入困境,并且与我使用过的任何东西都不一样。由于它使用 MS Office 样式表,它会在 Excel 中打开,但遗憾的是我正在开发一个自动化流程。

欢迎任何关于我如何实现这一目标的线索。

转换原始 XML 数据:

<?xml version="1.0" encoding="UTF-8"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<ss:Styles/>
<ss:Worksheet ss:Name="Information">
<ss:Table>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Name</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Age</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Unit</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Sally</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">29</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Greenford</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Dave</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">45</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Paddington</ss:Data>
</ss:Cell>
</ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>

进入这个:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Report Title="Location">
<Record>
<Name>Sally</Name>
<Age>29</Age>
<Unit>Greenford</Unit>
</Record>
<Record>
<Name>Dave</Name>
<Age>45</Age>
<Unit>Paddington</Unit>
</Record>
</Report>

谢谢。

【问题讨论】:

    标签: xslt ms-office xls


    【解决方案1】:

    以下样式表将为您提供所需的输出 XML。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" exclude-result-prefixes="ss">
      <xsl:output method="xml" encoding="ISO-8859-1"/>
      <xsl:strip-space elements="*"/>
    
      <!-- Match the table, output the root node and select the rows
           excluding the row that contains the header. -->
      <xsl:template match="ss:Workbook/ss:Worksheet/ss:Table">
        <xsl:text>&#xa;</xsl:text>
        <Report Title="Location">
          <xsl:text>&#xa;</xsl:text>
          <xsl:apply-templates select="ss:Row[not(position()=1)]"/>
        </Report>
        <xsl:text>&#xa;</xsl:text>
      </xsl:template>
    
      <!-- Now we're at a row. Match the data in each cell. -->
      <xsl:template match="ss:Row">
        <Record>
          <xsl:text>&#xa;</xsl:text>
          <xsl:apply-templates select="ss:Cell/ss:Data"/>
        </Record>
        <xsl:text>&#xa;</xsl:text>
      </xsl:template>
    
      <!-- Output an element for each piece of data. -->
      <xsl:template match="ss:Data">
        <!-- Find which column we are at. -->
        <xsl:variable name="column" select="count(../preceding-sibling::ss:Cell) + 1"/>
        <!-- The name of the element comes from the corresponding column 
         in the header (the first row). -->
        <xsl:element name="{//ss:Workbook/ss:Worksheet/ss:Table/ss:Row[1]/ss:Cell[$column]/ss:Data}">
          <xsl:value-of select="."/>
        </xsl:element>
        <xsl:text>&#xa;</xsl:text>
      </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 嗨,本 - 非常感谢。当我尝试应用转换时,我得到 Expected QName:name="{//ss:Workbook/ss:Worksheet/ss:Table/ss:Row[1]/ss:Cell[$column]/ss:Data}"
    • 此 XSL 适用于我的示例 XML。您可以在here 中看到它。您是否将其应用于不同的输入 XML?
    • 不能否认你!必须是我向其展示 XSLT 的应用程序。本谢谢。感谢您向我介绍 xmlplayground。这将证明非常有用:)
    猜你喜欢
    • 2012-08-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2011-11-20
    相关资源
    最近更新 更多