XSLT转换 - 命名空间/一般错误

时间:2015-05-10 07:13:36

标签: xml xslt

我尝试将Excel xml文件的一部分呈现为HTML,以便在计算机辅助翻译工具中翻译(外语翻译)部分内容时进行改进预览。

我有这个xml:

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Styles>
  <Style ss:ID="Default">
   <Alignment ss:Vertical="Bottom"/>
  </Style>
  <Style ss:ID="Header">
   <Font ss:Bold="1"/>
  </Style>
  <Style ss:ID="DateFormat">
   <NumberFormat ss:Format="General Date"/>
  </Style>
 </Styles>
 <Worksheet ss:Name="ResultSet">
  <Table>
   <Row>
    <Cell><Data ss:Type="Number"><![CDATA[149768]]></Data></Cell>
    <Cell><Data ss:Type="String"><![CDATA["@" cannot be the first character in an e-mail address!]]></Data></Cell>
    <Cell><Data ss:Type="String"><![CDATA[Multiword - Noun]]></Data></Cell>
    <Cell><Data ss:Type="String"><![CDATA[]]></Data></Cell>
    <Cell><Data ss:Type="String"><![CDATA[]]></Data></Cell>
    <Cell><Data ss:Type="String"><![CDATA[Input validation message]]></Data></Cell>
    <Cell><Data ss:Type="String"><![CDATA[]]></Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>

我试图从每一行获取第二个数据元素并显示它,但我根本无法显示它。我认为它与名称空间有关,我必须遗漏一些东西,但不能看到什么。这就是我正在使用的:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
 <xsl:template match="/">
  <html>
  <body>
    <xsl:for-each select="/Workbook/Worksheet/Table/Row"><br/>
      <font color="#380000" size="3"><xsl:value-of select="/Cell[2]/Data"/></font><br/>
    </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

任何人都可以帮我吗?

我应该补充一点,我使用Treebeard来测试这个并且它使用这些错误来验证xml(我无法控制)...增加了我的困惑:

  

错误:org.xml.sax.SAXParseException; lineNumber:3; columnNumber:10;文档无效:未找到语法。   错误:org.xml.sax.SAXParseException; lineNumber:3; columnNumber:10;文档根元素&#34;工作簿&#34;,必须与DOCTYPE root匹配&#34; null&#34;。

谢谢

1 个答案:

答案 0 :(得分:1)

这里实际上有两个名称空间问题:

  1. 输出元素位于默认命名空间中,您使用xmlns="urn:schemas-microsoft-com:office:spreadsheet"声明它们,但它们可能位于XHTML命名空间中。
  2. 您的XPath表达式选择null命名空间中的元素,但它们应该选择命名空间urn:schemas-microsoft-com:office:spreadsheet中的元素。 AFAIK,在XSLT 1.0中,这只能使用前缀来完成。
  3. 要解决问题1.,您可以将默认命名空间声明更改为xmlns="http://www.w3.org/1999/xhtml",也可以为此命名空间使用前缀。

    要解决问题2.,必须在XPath表达式中为所有元素名称添加前缀ss:,该名称绑定到所需的名称。

    还有一个问题:XPath表达式/Cell[2]/Data/开头,因此是绝对路径表达式。你想要一个相对的,所以省略斜杠。