2015-05-10 26 views
0

我试图在翻译(外语翻译)部分内容的计算机辅助翻译工具时,将部分Excel xml文件渲染为改进预览的HTML。XSLT转换 - 名称空间/一般错误

我有这样的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> 

谁能帮助我?

我要补充一点,我使用树胡对此进行测试并验证XML(我却无法控制)这些错误......添加到我的困惑:

error: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 10; Document is invalid: no grammar found. error: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 10; Document root element "Workbook", must match DOCTYPE root "null".

谢谢

+2

错误消息表明你的XML文档在开头有'<!DOCTYPE root>',但是你没有显示任何类似的东西。无论如何,如果你有'DOCTYPE',那么下面的名字必须与根元素名称匹配,即如果它是'Workbook',那么声明需要说'<!DOCTYPE Workbook>'。至于命名空间问题,这是与XSLT和XPath有关的FAQ,例如,请参阅http://stackoverflow.com/questions/1730875/xslt-transform-xml-with-namespaces?rq=1。 –

回答

1

你其实这里有两个问题的命名空间:

  1. 输出元素都在默认名称空间,您有xmlns="urn:schemas-microsoft-com:office:spreadsheet"声明,但他们可能应该在XHTML命名空间。
  2. XPath表达式选择空名称空间中的元素,但它们应该选择命名空间urn:schemas-microsoft-com:office:spreadsheet中的元素。 AFAIK,在XSLT 1.0中,这只能使用前缀来完成。

要解决问题1,您可以将默认名称空间声明更改为xmlns="http://www.w3.org/1999/xhtml"或使用此名称空间的前缀。

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

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