2013-09-09 2 views
0

Учитывая следующий XML:Интерпретированный против Составитель XSLT 1.0 производит различные выходные JSON

<abc> 
    <def> 
     <one>Hello</one> 
     <two>World</two> 
    </def> 
</abc> 

И файл XSL для преобразования XML в JSON доступен здесь: http://dropbox.ashlock.us/open311/json-xml/xml-tools/xml2json_spark.xsl

При преобразовании с помощью INTERPRETED XSLT (ПРОЦЕССОР: Apache Software Foundation,, javax.xml.transform.TransformerFactory = org.apache.xalan.processor.TransformerFactoryImpl), выходной сигнал в формате JSON является:

{"abc":[{"one":"Hello","two":"World"}]} 

При преобразовании с помощью Составитель XSLT (ПРОЦЕССОР: Apache Software Foundation (Xalan XSLTC), javax.xml.transform.TransformerFactory = org.apache.xalan.xsltc.trax.TransformerFactoryImpl), выходной сигнал в формате JSON является:

[{"one":"Hello","two":"World"}] 

Почему 2 процессора производят разные результаты? Выход

ответ

2

Саксона такой же, как XSLTC:

[{"one":"Hello","two":"World"}] 

Я не пытался отладить таблицу стилей в деталях. Он не содержит ничего явно определенного для реализации, поэтому он выглядит как ошибка в интерпретации Xalan.

Эта картина вызывает сомнения, хотя не является незаконным:

*[count(../*[name(../*)=name(.)])=count(../*) and count(../*)>1] 

Это сомнительно, потому что имя (../*) поставляет последовательность элементов в функции имен. Это было бы ошибкой в ​​XSLT 2.0, но в режиме 1.0 оно дает имя первого выбранного элемента. Предположительно, автор предположительно предположил бы что-то вроде

*[count(../*[name(.)=name(current())])=count(../*) and count(../*)>1] 
Смежные вопросы