<apply-template> вывод в переменную и доступ к ней - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь определить и скопировать количество элементов, используя и сохраняя вывод в переменной. Но даже с функцией exsl: node-set () вывод рассматривается как отдельный узел / элемент, и я не могу получить доступ к отдельным элементам в нем.

Я использую стандартные процессоры xslt в Eclipse, а именно JRE Instance Default и Xalan 2.7.1

Вот простой XML-файл, который я использую в качестве примера более крупной задачи:

<root>
    <group>
        <type>2</type>
        <item>4</item>
        <item>5</item>
        <item>6</item>
    </group>
</root>

Вот xslt:

<?xml version='1.0' encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common">

<xsl:template match="/"> 
    <root> 
        <xsl:variable name="items">
            <xsl:apply-templates select="//item" />
        </xsl:variable>

        items count: <xsl:value-of select="count(exsl:node-set($items))"/>
        item output: <xsl:value-of select="exsl:node-set($items)"/>
    </root>
</xsl:template>

<xsl:template match="item">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

Похоже, что node-set () не преобразует фрагмент дерева в набор узлов, а просто создает один узел / блок.

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:exsl="http://exslt.org/common">

    items count: 1
    item output:
</root>

Как мне получить набор узлов из нескольких элементов для дальнейшей работы с ним?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Для подсчета выполните:

<xsl:value-of select="count(exsl:node-set($items)/item)"/>

В противном случае вы считаете родительскую переменную, из которой только одна.Точно так же, если вы хотите обработать элементы в переменной, вам нужно будет сделать:

<xsl:for-each select="exsl:node-set($items)/item"/>

Для содержимого переменной попробуйте:

<xsl:copy-of select="exsl:node-set($items)"/>

илипросто:

<xsl:copy-of select="$items"/>

(вам не нужно преобразовывать фрагмент дерева результатов в набор узлов, чтобы скопировать его).

Что вы делаете:

<xsl:value-of select="exsl:node-set($items)"/>

извлекает строковое значение всей переменной, равное 456 (не пустое, как вы сообщаете).

0 голосов
/ 02 апреля 2019

Обновление:

Из-за технического сбоя с моей стороны я не смог понять, что это не сработает с версией XSL 1.0.Мы с Майклом отметили, что ваш XPath неверен.Мой пример ниже работает только с XSL версии 2.0 или новее, поэтому используйте код Майкла для версии 1.0.


Ключевая проблема заключается в выражениях XPath для работы с вашей переменной.

Когда выобъявите вашу переменную следующим образом:

    <xsl:variable name="items">
        <xsl:apply-templates select="//item" />
    </xsl:variable>

... вы получите переменную в памяти $items, которая имеет это:

    <item>4</item>
    <item>5</item>
    <item>6</item>

Когда я запускаю ваш код,место, где вы просто выталкиваете значение с помощью xsl:value-of, я просто получаю поведение по умолчанию, где XSL выплевывает строковое значение содержимого:

<?xml version="1.0" encoding="UTF-8"?><root xmlns:exsl="http://exslt.org/common">

        items count: 1
        item output: 456</root>

Так как я получаю немного другой вывод, я должен спросить- какой процессор XSL вы используете?

Кроме того, эта переменная, в частности, не набор узлов, а скорее фрагмент документа .Поэтому, если вы хотите получить доступ к какому-либо конкретному элементу <item> в этой переменной, вам нужно рассматривать имя переменной как корень.Так что если у вас есть count($items), вы просто получите счет 1, поскольку есть только один корневой элемент.

Для подсчета <item> элементов в пределах $items вам необходимоукажите правильный XPath: count($items/item).

Кроме того, чтобы вывести строковое значение переменной, вам не нужно менять его на набор узлов.

Попробуйте это для своего корневого шаблона:

<xsl:template match="/"> 
    <root> 
        <xsl:variable name="items">
            <xsl:apply-templates select="//item" />
        </xsl:variable>

        items count: <xsl:value-of select="count($items/item)"/>
        item output: <xsl:value-of select="$items"/>
    </root>
</xsl:template>

Мой вывод:

<?xml version="1.0" encoding="UTF-8"?><root xmlns:exsl="http://exslt.org/common">

        items count: 3
        item output: 456</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...