2016-10-24 2 views
1

Я использую python/lxml для перевода исходного xml в целевой XML-формат. Я продолжаю получать XLSTParseError, когда пытаюсь сопоставить шаблон с любыми другими элементами, кроме root ('/'), но не могу понять, что не так - довольно уверен, что его пространство имен связано ... Содержимое, которое я пытаюсь получить из исходного xml, содержащихся в элементах. Любая идея, как исправить или как получить lxml для вывода более подробных сообщений об ошибке?lxml throwing xslt parse error - не удается сопоставить шаблон никому другому, кроме root

Источник XML имеет заявление:

<?xml version="1.0" encoding="UTF-8"?> 
 
    <dataroot generated="2016-10-24T09:16:37" xsi:noNamespaceSchemaLocation="BOLIG_XML.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:od="urn:schemas-microsoft-com:officedata"> 
 
\t <BOLIG_XML>...</BOLIG_XML> 
 
\t <BOLIG_XML>...</BOLIG_XML>

... 

Target XML имеет заявление:

<?xml version="1.0" encoding="utf-8"?> 
 
    <BoligListe xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:oio:lbf:1.0.0"> 
 
\t  <BoligStruktur>...</BoligStruktur> 
 
\t  <BoligStruktur>...</BoligStruktur> 
 
     ...

XSLT в настоящее время выглядит следующим образом:

xslt_tree = etree.XML('''\ 
 
     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
     <xsl:template match="/"> 
 
\t   <BoligListe xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:oio:lbf:1.0.0"> 
 
      <xsl:template match="BOLIG_XML"> 
 
        <BoligStruktur>hello world</BoligStruktur> 
 
       </xsl:template> 
 
      </BoligListe> 
 
     </xsl:template> 
 
     </xsl:stylesheet>''' 
 
    )

ответ

0

xsl:template Каждый элемент должен быть верхний уровень элемент таблицы стилей корневого элемента, вы можете не вложенные шаблоны, как вы, кажется, пытаются сделайте в своем XSLT-коде. Затем вы используете xsl:apply-templates для обработки дочерних элементов с соответствующим шаблоном, поэтому, я думаю, вы хотите

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <BoligListe xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:oio:lbf:1.0.0"> 
      <xsl:apply-templates/> 
     </BoligListe> 
    </xsl:template> 
     <xsl:template match="BOLIG_XML"> 
       <BoligStruktur>hello world</BoligStruktur> 
      </xsl:template> 
    </xsl:stylesheet>