#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) Я сталкиваюсь с этой проблемой.