заполнить узел из динамической переменной - PullRequest
0 голосов
/ 06 февраля 2012

Я хочу получить значение "a" в узле a под корневым тегом в выходном документе (входные данные могут быть любыми). Я знаю, что если я сделаю

<xsl:value-of select="$item1"/>

Я получу желаемое значение. Однако я хочу использовать что-то вроде

<xsl:value-of select="concat('$item','1')"/>

Причина в том, что я могу динамически создавать много переменных, и число в конце переменной увеличивается. Таким образом, у меня может быть item1, item2, item3 и т. Д. Я показал здесь пример, поэтому я использую жестко закодированное значение '1' в значении select. Возможно ли это в xslt1.0?

Вот мой xslt, любой входной XML может использоваться

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <xsl:variable name="item1" select="'a'" />
      <Root>
        <a>
          <xsl:value-of select="concat('$item','1')"/>
        </a>
      </Root>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

1 голос
/ 06 февраля 2012

Переменные, подобные PHP, невозможны в XSLT 1.0 / XPath 1.0.

С помощью функции node-set() расширения exslt вы можете создать набор узлов, который работает как массив.

<?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'
                xmlns:msxsl='urn:schemas-microsoft-com:xslt'
                exclude-result-prefixes='msxsl exsl'>

<xsl:template match='/'>
    <!-- result tree fragment -->
    <xsl:variable name='_it'>
        <em>a</em>
        <em>b</em>
        <em>c</em>
        <em>d</em>
    </xsl:variable>
    <!-- create a node-set from the result tree fragment -->
    <xsl:variable name='it' select='exsl:node-set($_it)'/>
    <Root>
        <a>
            <!--
                this is a normal xpath with the variable '$it' and a node 'em'
                the number in brackets is the index starting with 1
            -->
            <xsl:value-of select='$it/em[1]'/> <!-- a -->
            <xsl:value-of select='$it/em[2]'/> <!-- b -->
        </a>
    </Root>
</xsl:template>

<!-- MS doesn't provide exslt -->
<msxsl:script language='JScript' implements-prefix='exsl'>
    this['node-set'] = function (x) {
        return x;
    }
</msxsl:script>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...