После обновления saxon-he-10.5 JAR, столкнувшись с проблемой при преобразовании

#xslt #xpath

Вопрос:

У меня есть два файла XSL, один XSL импортирует другой , не получая никакого значения в переменных данных. Переменные данные, которые я использую ниже, чтобы получить атрибуты. Так как данные пусты. Не получая от этого никакой ценности. есть ли что-то неправильное в этой строке <xsl:имя переменной=»данные» выберите=»$заголовок/разделы/код[@ключ=$ключ]»/>

XSL 1 : Veichle.xsl

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="Motor.xsl"/>
  <xsl:output omit-xml-declaration="yes" method="xml" />
  <xsl:param name="key" select="'vita'"/>
</xsl:transform>
 

XSL 2: Двигатель.xsl

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:f1="urn:hl7-org:v3"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cda="urn:hl7-org:v3"
  xmlns:sdtc="urn:hl7-org:sdtc" xpath-default-namespace="http://hl7.org/fhir"
  xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:lookup="http://lookup.data"
  xmlns:uuid="java:java.util.UUID" exclude-result-prefixes="fn lookup uuid sdtc cda xsl xsi f1">
    <xsl:import href="section.xsl"/>
    <xsl:output omit-xml-declaration="yes" method="xml"/>
    <xsl:param name="key" select="'results'"/>
    <xsl:param name="mostRecent" select="false()"/>
    <xsl:variable name="header">
</xsl:transform>  
 

Комментарии:

1. Да, пространство имен xpath-по умолчанию есть в <xsl:преобразование><xsl:преобразование></xsl:преобразование>

Ответ №1:

Выражение $header/sections/code/[@key=$key] было недопустимо в XPath 1.0, 2.0 или 3.0. В XPath 3.1 оно имеет значение (возвращает массив), но это не то значение, которое вы думаете, что оно имеет. Как объясняет Мартин, вы , вероятно, намеревались $header/sections/code[@key=$key] , но я не знаю, почему ваш предыдущий процессор XSLT не отметил ошибку.

Комментарии:

1. Да, исходный код, имеющий $заголовок/разделы/код[@key=$key], я неправильно добавил здесь

2. Ну, насколько я вижу $data , переменная не используется в вашем преобразовании, так что вы все еще чего-то не договариваете нам. Мы не можем решить проблему на основе неполной информации.

3. Ранее я дал код, в котором была основная причина, я добавил фрагмент кода, в котором мы пытаемся получить элемент из переменных данных.

4. Теперь вам необходимо устранить проблемы с пространством имен, выявленные Мартином Хонненом.

Ответ №2:

В дополнение к проблеме с пространством имен, указанной в комментарии, т. Е. чтобы указать xpath-default-namespace="http://hl7.org/fhir" , где вы хотите выбрать элементы из этого пространства имен, другая ошибка в вашем коде находится в разделе $header/sections/code/[@key=$key] , где вы, вероятно, хотите $header/sections/code[@key=$key] , т. Е. логический предикат на последнем шаге для code элементов.

Если вы действительно обновили XSLT 1 или 2 до Saxon 10, то я бы подумал, что для старых процессоров выражение, которое у вас есть, должно было выдать вам ошибку, и в XSLT 3 оно создаст последовательность массивов с логическим значением.

Комментарии:

1. Мой плохой, исходный код <xsl:имя переменной=»данные» выберите=»$заголовок/разделы/код[@ключ=$ключ]»/>. При добавлении вопроса сюда он был добавлен.

2. @Sumit, возможно, добавьте более точную информацию о том, какой результат вы хотите получить, какую версию процессора XSLT вы использовали ранее. С <xsl:param name="key" select="'results'"/> и выражением $header/sections/code[@key=$key] я не вижу, как code key="engine" или code key="exterior" можно было бы выбрать.

3. Мы используем XSLT 2.0. Тот же код отлично работает с Saxon HE 9.x . Когда я запускаю это локально или через командную строку, как предлагает Saxonica, информация о тенденциях работает нормально. Но один я запускаю это на сервере(Jboss) Я сталкиваюсь с этой проблемой.