Передайте массив double как параметр в xsl - PullRequest
2 голосов
/ 16 августа 2010

Мне нужен твой блестящий ум! У меня следующая проблема: у меня есть документ xsl, и я хочу передать массив как параметр (или переменную) этому xsl, чтобы выполнить итерацию по нему.

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="properties.xsl" />
<xsl:param name="upperLimit" />
<xsl:param name="value" />
<xsl:variable name="array" />
<xsl:template match="/">
    <Chart zdepth="60" exeTime="2" chartOrder="area,column">
        <categories>
            <category label="Jan"/>
            <category label="Feb"/>
            <category label="Mar"/>
            <category label="Apr"/>
            <category label="May"/>
            <category label="Jun"/>
            <category label="Jul"/>
            <category label="Aug"/>
            <category label="Sep"/>
            <category label="Oct"/>
            <category label="Nov"/>
            <category label="Dec"/>
        </categories>
        <dataset seriesName="budget" color="1E90FF" plotBorderColor="1E90FF" renderAs="column">
            <set value="{$value}"/>
            <set value="32800"/>
            <set value="32600"/>
            <set value="29600"/>
            <set value="32600"/>
            <set value="32600"/>
            <set value="31800"/>
            <set value="36700"/>
            <set value="29700"/>
            <set value="31900"/>
            <set value="32900"/>
            <set value="34800"/>
        </dataset>
        <dataset seriesName="sales" color="EE2C2C" plotBorderColor="EE2C2C" renderAs="area">
            <xsl:for-each select="$array">
                <xsl:copy-of select="."/>
            </xsl:for-each>

        </dataset>
        <styles>
            <definition>
                <style name="captionFont" type="font" size="15"/>
            </definition>
            <application>
                <apply toObject="caption" styles="captionfont"/>
            </application>
        </styles>

        <xsl:call-template name="properties"/>

    </Chart>
</xsl:template>

У меня есть элемент, в котором у меня есть элементы, и я хочу, чтобы у каждого было какое-то значение из "массива". (что-то в этом роде: или даже в каком-то цикле:).

Как я могу это сделать? Любое предложение будет очень-очень полезным и как можно скорее!

Спасибо.

1 Ответ

0 голосов
/ 16 августа 2010

XSLT 1.0 и XPath 1.0 не имеют ничего достаточно близкого к «массиву двойников».

В XSLT такой массив может быть смоделирован набором элементов с одним дочерним узлом текстового узла (небольшое содержание в терминологии XSD), например:

<num>1.2345</num>
<num>2.2345</num>
<num>3.2345</num>
<num>4.2345</num>
<num>-.2345</num>

Такой набор узлов может быть передан в качестве внешнего параметра инициатором преобразования , и способ его выполнения зависит от конкретного процессора XSLT. Например, способ передачи параметров в XslCompiledTransform.Transform() определен здесь .

Если вышеуказанный набор узлов был передан как значение глобально определенного xsl:param с именем pDoubles, то

$pDoubles[$k] выбирает элемент $ k-й num в наборе узлов, и его дочерний текстовый узел может быть неявно использован в других выражениях. Например:

$pDoubles[1] + $pDoubles[2]

оценивается как

3.469

В XPath 2.0 (и, следовательно, в XSLT 2.0) существует тип данных, который намного ближе к массиву значений - тип данных последовательности .

В XPath 2.0 наиболее близко к массиву пар - это последовательность пар (xs:double). Такая последовательность может быть передана как внешний параметр в преобразование XSLT 2.0, а также подробности, как это сделать. это зависит от поставщика. Например, как это сделать для саксонцев, посмотрите здесь .

Обратите внимание : наборы узлов в XPath 1.0 и только последовательности в XPath 2.0 имитируют массивы - они не являются массивами, и одно из самых важных отличий заключается в том, что хотя массив доступ очень быстрый (O (1)), доступ к произвольному узлу / элементу из набора / последовательности узлов может быть O (N).

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