2016-09-10 2 views
0

Я хотел бы загрузить элемент из внешнего XML в переменную в файле шаблона XSL. Я загружаю документ в переменную без проблем, но я не могу найти способ corect, как найти точный узел, который мне нужен, основываясь на значении его дочернего элемента. Структура внешнего XML является:XSL получить переменную из внешнего XML со списками

<mainNode> 
<node1> 
    <nodeList1withManyChilds> 
    <nodeList2withOnlyOneChild> 
    <node2> 
    <node3> 
     <node4withIDvalueUsedToBeSelectedBy>100</node4withIDvalueUsedToBeSelectedBy> 
    </node3> 
    </node2> 
    </nodeList2withOnlyOneChild> 
    <nodeList2withOnlyOneChild> 
    <node2> 
    <node3> 
     <node4withIDvalueUsedToBeSelectedBy>101</node4withIDvalueUsedToBeSelectedBy> 
    </node3> 
    </node2> 
    </nodeList2withOnlyOneChild> 
    <nodeList2withOnlyOneChild> 
    <node2> 
    <node3> 
     <node4withIDvalueUsedToBeSelectedBy>102</node4withIDvalueUsedToBeSelectedBy> 
    </node3> 
    </node2> 
    </nodeList2withOnlyOneChild> 
    </nodeList1withManyChilds> 
</node1> 
</mainNode> 

нужно выбрать правильный <node2> элемент и выбор должен быть основан на значении <node4...> = 100.

В XSL файл у меня есть:

<xsl:variable name="firstList" select ="$loadedDoc//mainNode/node1" /> 

, и я не уверен, как назначить другой переменной точный <node2>, у которого есть дочерний ребенок с искомым значением. Список коллекции делает мне проблемы ...

Спасибо за любые подсказки!

+0

Вопрос Youfr непонятен. Вы хотите, чтобы вы выбрали 'node2', который содержит' node4 ... 'со значением' 100'? С '100', жестко закодированным в таблицу стилей? - Обратите внимание также, что ваши теги не соответствуют 'node4withIDvalueUsedToBeSelectedBy'! =' Node4withIDvalue'! –

+0

Пожалуйста, проверьте вопрос сейчас, недавно пропустите цитаты. Просто скажите, мне нужно открыть файл XML-файла шаблона XSL, получить значение «node2» из этого загруженного XML на основе его дочернего значения child (list) –

ответ

0

Там нет ни одного элемента в исходном XML-документе под названием «узел», поэтому переменной

<xsl:variable name="firstList" select ="$loadedDoc//node/node1" /> 

будет пустая последовательность. Это не хорошее место для начала.

В вашем примере есть только один узел с именем node4withIDvalueUsedToBeSelectedBy, так что вы можете выбрать его просто как

//node4withIDvalueUsedToBeSelectedBy 

Но я подозреваю, что это не его настоящее имя, так как конечный тег не соответствует, и для всех мы знаем, что есть другие элементы с тем же именем в другом месте документа.

Может быть, вы хотите //node4withIDvalue[. = '100']

Но это очень трудно убедиться, потому что информация, которую вы дали нам неполна и противоречива.

+0

Извините, я плохо написал образец дерева. Теперь я отредактирован и более ясен, надеюсь. Основываясь на вашем совете, я попытался вместо: (и, чем следующий путь, как получить правильный дочерний узел) с помощью без положительного результата.Я не уверен, как работать с этим загруженным документом, поскольку для меня это не ясно, как -context- в общей работе XSL. Заранее благодарю за то, что вы получили еще один совет. –

0

Если я угадал правильно, вы хотите (!):

<xsl:variable name="var2" select="$loadedDoc//node2[descendant::node4withIDvalue=100]"/> 
+0

Да, я также подумал, что могу использовать это и работать. Но по какой-то причине это не работает. Когда я использую '', узлы, выбранные 'запросомNodesName', не выбраны. Если 'requestNodesName = mainNode или node1', он работает. Но когда я углубляюсь в иерархию и встречаю первый список 'nodeList1withManyChilds', для меня ничего не работает. –

+0

@ black-sabath Это сработало для меня, используя точный пример, который вы опубликовали (кроме моего XML имеет 'node4withIDvalue' вместо этого, если' node4withIDvalueUsedToBeSelectedBy'). Вы также можете увидеть, как он работает здесь: http://xsltransform.net/pPJ8LV2 –

0

Наконец, я узнал решение этой проблемы. Поскольку внешний XML с объявленными пространствами имен, я работал с ними не правильно. Объявление имени узла, вкл. пространство имен было не совсем понятным. Да, я не упомянул пространства имен, например, что показывает, как ничтожны они были для меня в этом случае ...

решение для пространств имен:

<xsl:variable name="var" select="$loadedDoc//*[local-name() = 'node4withIDvalueUsedToBeSelectedBy' and . = $varWithFindValue]" /> 

Моя вина, я не упомянул пример со всеми важные детали. Благодарю.

Смежные вопросы