Я обновил версию SaxonB (процессор XSLT 2.0) с 9.0 до 9.1.0.8, и моя программа (XML Web Generator) перестала работать.SaxonB 9.0 vs. SaxonB 9.1.0.8 и xs: boolean vs. xs: ошибка типа строки
Преобразование XSLT выполняется с использованием Ant. И Saxon Теперь жалуется:
[xslt] .../stránka.xsl:37: Fatal Error! Required type is xs:boolean; supplied value has type xs:string
[xslt] Failed to process null
Но на строке 37 этого XSLT-файла есть:
<xsl:include href="stránka-společné.xsl"/>
и это, вероятно, не проблема. Это может быть на линии 47, где я использую свойство (набор из Ant) в < XSL: если тест = "$ SomeProperty"/>
Свойство объявлен в включенной XSL файл:
<xsl:param name="someProperty" select="false()" as="xs:boolean"/>
I используйте символы Unicode в имени свойства, но он должен работать, не так ли? (по крайней мере, он работал в 9.0). Я попытался использовать ASCII, и это не помогло.
Это также не версия Ant или Java, потому что независимо от того, работает она или нет, это зависит только от пути к файлу JAR (9.0 по сравнению с 9.1.0.8).
Я хотел был бы сделать приложение совместимым с 9.1.0.8. (Или это ошибка в SaxonB?)
Версии Я использовал (SHA-256):
3cb7336b154eabfb0d78a1b9b5f7c70e15a9c790193676803fa4391b60de7ebb saxonb-9.0.jar (working)
dc09c0e3d03609ff3c11b1e19446ca82a5f7f1bc364173b7910f2267312bd7d5 saxonb-9.1.0.8.jar (error described above)
Файлы могут быть найдены, например, на package.ubuntu.com внутри .deb файлов - пакет libsaxonb-java
в lucid (9.0) или raring (9.1.0.8).
Update # 1
Если удалить использования этого проблемного свойства (переменные в XSLT) я получил другую ошибку:
[xslt] Failed to process null
BUILD FAILED
…/build.xml:39: ; SystemID: file:…/šablona/makra/diagramy.xsl; Line#: 63; Column#: -1
net.sf.saxon.instruct.TerminationException: Processing terminated by xsl:message at line 89 in diagramy.xsl
at net.sf.saxon.instruct.Message.processLeavingTail(Unknown Source)
at net.sf.saxon.instruct.Choose.processLeavingTail(Unknown Source)
at net.sf.saxon.expr.LetExpression.processLeavingTail(Unknown Source)
…
Что также специфично для версии 9.1.0.8 (с 9.0 У меня нет ошибки). В строке 63 в diagramy.xsl
есть:
<xsl:variable name="souborDiagramu" select="j:vytvořDiagram(
$zadání,
@orientace = 'vodorovně',
$kompletní,
tokenize(base-uri(), '/')[last()],
@src
)"/>
Где @orientace
и @src
отсутствуют в исходном документе (в 9,0 такие атрибуты были переданы методу Java vytvořDiagram(…)
как null
аргументы).
Update # 2
Я написал функцию в Java, чтобы получить тип недвижимости:
public static String zjistiTyp(Object o) {
if (o == null) {
return "null";
} else {
return o.getClass().getName();
}
}
С версии 9.0 это
<xsl:message>Typ proměnné $podporaZaostalýchProhlížečů = <xsl:value-of select="j:zjistiTyp($podporaZaostalýchProhlížečů)"/></xsl:message>
успешно печатает:
[xslt] Typ proměnné $podporaZaostalýchProhlížečů = java.lang.Boolean
Но с 9.1.0.8 Я получил ошибку Required type is xs:boolean; supplied value has type xs:string
, даже если я удалил любые другие препятствия (использование этого свойства), и преобразование продолжается, если я удалю его последнее использование: <xsl:message>Typ proměnné…
(но тогда я не могу узнать тип свойства).
Так что, похоже, что строка false
(или true
) может передаваться от Ant в XSLT и даже Собственость могут быть объявлены в XSLT, используя эту конструкцию:
<xsl:param name="podporaZaostalýchProhlížečů" select="false()" as="xs:boolean"/>
, но он не может быть использован - использование такого свойства вызывает ошибку (но только в 9.1.0.8 - в 9.0 оно работает).
Update # 3
Я нашел обходной путь для одной части проблемы.
<xsl:param name="someParameterUncasted"/>
<xsl:variable name="someParameter" select="$someParameterUncasted cast as xs:boolean"/>
Но это уродливо, потому что мне нужны два имени для одного параметра - разные в Ant и разные в XSLT. Есть ли способ передать Boolean-типизированный параметр из Ant в XSLT? Почему это перестало работать в Saxon 9.1.0.8, хотя оно работало в 9.0?
И есть также вторая часть проблемы 9.0/9.1.0.8: при передаче значения некоторого отсутствующего атрибута в метод Java, в 9.0 он работал, и Java просто получил значение null. В 9.1.0.8 это приводит к ошибке.
Скорее всего, Саксон жалуется на что-то в stránka-společné.xsl (и отмечая, что он был вызван в строке 37 stránka.xsl), чем это было бы думать, что это было в строке 37, когда оно было фактически на линии 47. Что находится в модуле stránka-společné.xsl? –
Thanks; Я не нашел соответствующие файлы на package.ubuntu.com, но ваш репозиторий был легче ориентироваться. Как вы передаете значение параметра 'podporaZaostalýchProhlížečů' из Ant? Я предполагаю, что некоторые аспекты интерфейса Ant изменились в Saxon 9.1 (сайт Saxonica говорит, что 9.1 больше не включает в себя пользовательскую задачу Ant для Saxon). –
Вы можете увидеть полный исходный код в моем [ртутном репозитории] (http://hg.frantovo.cz/xml-web-generator/file/c1999d6bc76a/%C5%A1ablona), если хотите :-) В 'stránka-společné ,xsl' в вопросе упоминается параметр. Если я удалю IF в 'stránka.xsl', который использует свойство, он продолжает и сбой где-то в другом месте (см. Обновление № 1). – Franta