XSLT «Выбрать-Когда» для установки переменной дает разные результаты - PullRequest
0 голосов
/ 13 февраля 2019

Я изменяю некоторый XSLT и пытаюсь условно установить переменную, используя select-when.Ранее переменная была установлена ​​без каких-либо условий. Я не могу понять, почему.

Ранее она была установлена ​​с помощью:

            <xsl:variable name="fields" select="pubs:field[@name=normalize-space($elements)]" />

Я пытался установить поля $, используя:

            <xsl:variable name="fields">
            <xsl:choose>
                <xsl:when test="contains($elements, 'acceptance-date')">
                    <xsl:value-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:otherwise>
            </xsl:choose>
            </xsl:variable>

Я ожидаю, что остальная часть моего кода будет продолжаться, как это делалось ранее, на данный момент я установил его таким образом, пока экспериментировал (операторы select идентичны).Вместо этого я получаю «Ошибка XPATH: неверный тип», когда переменная $ fields используется в другом месте:

            <xsl:variable name="field_values" select="$fields/pubs:people/*|$fields/pubs:keywords/*|$fields/pubs:items/*|$fields/*[local-name()!='items' and local-name()!='keywords' and local-name()!='people']" />

Я относительно новичок в XSLT / XPATH, поэтому я предполагаю, что это что-то очевидное, что япропал без вести.

Спасибо, Джеймс

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Ваш пример, очевидно, не реален, потому что две ветви условного обозначения совпадают.Но во многих случаях вы можете сделать это:

<xsl:variable name="x" 
 select="$nodes[contains($elements, 'acceptance-date')] 
       | $other-nodes[not(contains($elements, 'acceptance-date'))]"/>

Подумайте, действительно ли вы хотите использовать XSLT 1.0.Подобные проблемы становятся намного проще с XSLT 2.0 или 3.0.

0 голосов
/ 13 февраля 2019

Какой движок XSLT вы используете?Если это MS-XSL, вы можете попробовать использовать функцию node-set (), например

            <xsl:variable name="fields">
            <xsl:choose>
                <xsl:when test="contains($elements, 'acceptance-date')">
                    <xsl:copy-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:otherwise>
            </xsl:choose>
            </xsl:variable>

    <xsl:variable name="field_values" select="msxsl:node-set($fields)/pubs:field/pubs:people/*|msxsl:node-set($fields)/pubs:field/pubs:keywords/*|msxsl:node-set($fields)/pubs:field/pubs:items/*|msxsl:node-set($fields)/pubs:field/*[local-name()!='items' and local-name()!='keywords' and local-name()!='people']" />

и добавить объявление пространства имен в корневой элемент XSLT:

xmlns:msxsl="urn:schemas-microsoft-com:xslt"
...