2015-05-10 8 views
0

Я пытаюсь отобразить часть XML-файла Excel как 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', то следующее имя должно соответствовать имени корневого элемента, то есть если это« Рабочая книга », тогда в декларации должно быть указано« ». Что касается проблемы пространства имен, то это FAQ по отношению к XSLT и XPath, например, 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 начинается с / и поэтому является абсолютным признаком пути. Вы хотите относительный, поэтому опустите косую черту.

Смежные вопросы