Преобразовать XML в JSON в Python, используя l xml и XSLT - PullRequest
0 голосов
/ 12 января 2020

Я преобразую XML в JSON, используя python3, l xml -библиотеку и XSLT. Я продолжаю получать XSLTParseError при запуске моего кода, и я не уверен, как действовать дальше.

Образец XML Сообщение:

   <SOAP-ENV:Body>
      <ns0:BookStore xmlns:ns0="http://www.example.com/xsd/books">
         <ns0:Book>
            <ns0:Title>The Power of Now</ns0:Title>
            <ns0:Author>Vivek Ranadive</ns0:Author>
            <ns0:Date>1999</ns0:Date>
            <ns0:ISBN>0-06-566778-9</ns0:ISBN>
            <ns0:Publisher>Tibco Software Inc</ns0:Publisher>
         </ns0:Book>
      </ns0:BookStore>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ожидаемый JSON Результат:

  "Envelope": {
    "Body": {
      "BookStore": {
        "Book": {
          "Title": "The Power of Now",
          "Author": "Vivek Ranadive",
          "Date": 1999,
          "ISBN": "0-06-566778-9",
          "Publisher": "Tibco Software Inc"
        }
      }
    }
  }
}

Используется XSLT

Python Код:

dom = ET.parse('XML_Example01.xml')
xslt = ET.parse('XSLT.xsl')
transform = ET.XSLT(xslt)
newdom = transform(dom)
print(newdom)

Ошибка, которую я получаю:
XSLTParseError: xsl:when : could not compile test expression 'normalize-space(.) ne . or not((string(.) castable as xs:integer and not(starts-with(string(.),'+')) and not(starts-with(string(.),'0') and not(. = '0'))) or (string(.) castable as xs:decimal and not(starts-with(string(.),'+')) and not(starts-with(.,'-.')) and not(starts-with(.,'.')) and not(starts-with(.,'-0') and not(starts-with(.,'-0.'))) and not(ends-with(.,'.')) and not(starts-with(.,'0') and not(starts-with(.,'0.'))) )) and not(. = 'false') and not(. = 'true') and not(. = 'null')'

Моя основная причина использования XSLT - в конечном итоге добавить logi c для выполнения force-array, таким образом, преобразованный файл JSON имеет согласованные массивы. Кроме того, пример XML является просто обобщенным c XML, реальные файлы немного сложнее и больше с большим количеством вложений.

Я не не получаю ту же ошибку, если я использую те же XML и XSLT в XML Шпион для выполнения преобразования.

Большое спасибо за помощь

1 Ответ

0 голосов
/ 12 января 2020

Для вашей таблицы стилей требуется процессор XSLT 2.0. Процессор libxslt, используемый lxml, поддерживает только XSLT 1.0.

...