Выберите элемент xsl на основе индекса, определенного в параметре - PullRequest
2 голосов
/ 12 сентября 2010

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

//PHP
$xslt->setParameter('','player',$player);
$xslt->importStylesheet( $XSL );
print $xslt->transformToXML( $data ); 

//xslt
<xsl:param name="player" data-type="number"/>

<template match="/">
    <xsl:value-of select="result[$player]/@name" />
</template>

И я знаю, что значение параметра передается правильно, потому что я могу просто вывести значение параметра ($ player), и оно выведет правильное значение. Если я жестко закодирую индексированное число «$ player» в любое число индексов, которые я хочу, как показано ниже:

<template match="/">
    <xsl:value-of select="result[2]/@name" />
</template>

это работает. Итак, что я здесь делаю не так. Разве вы не можете использовать параметры / переменные для выбора индексов?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2010

Это может быть оценка значения вашего xsl: param в виде строки, а не числа. Вы можете явно преобразовать его в число, используя функцию number().

<xsl:value-of select="result[number($player)]/@name" />

Фильтр предикатов, указывающий число, является сокращением для [position()=$param]. Вы можете использовать xsl:param внутри фильтра предикатов, вот так, и он будет оценивать значение xsl:param как число:

<xsl:value-of select="result[position()=$player]/@name" />
1 голос
/ 13 сентября 2010

Если я жестко закодировал индексированное число «$ player» на любой номер индекса I хочу, как показано ниже:

<template match="/"> 
    <xsl:value-of select="result[2]/@name" /> 
</template>

это работает.

Нет, любой совместимый процессор XSLT ничего не выберет .

result[2]/@name

является относительным выражением для текущего узла, а текущий узел является / - document-node.

Любой правильно сформированный XML-документ имеет ровно один верхний элемент (никогда не два), поэтому

result[2]

эквивалентно:

/result[2]

и ничего не выбирает.

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

Также

<xsl:param name="player" data-type="number"/>

это неверный синтаксис. Инструкция <xsl:param> не имеет атрибута data-type.

Фактически, в XSLT 1.0 нет никакого способа указать тип переменных или параметров .

Вот почему в:

result[$player]/@name

$player обрабатывается как строка, а не как целое число.

Чтобы достичь желаемой "индексации", используйте :

result[position()=$player]/@name

Функция position() возвращает число, и это приводит к преобразованию другого операнда оператора = в (и используется как) число.

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