xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

XML & XSLT & PHP


Автор Сообщение
katyakrog
Гость




[9839] Вт Май 23, 2006 11:34
XML & XSLT & PHP
есть файл xml кот обрабатывается xsl шаблоном, в который через xsltProcessor->setParameter() передается переменная;
--------------
в php файле пишу:

xsltProcessor->setParameter('', 'text', '//items/item[@id=1] /')
------------------
в xsl:

<xsl:param name="text" />
.
.
.
<xsl:value-of select="$text" />
------------------
ВЫВОДИТ - саму строку "//items/item[@id=1]/", а не элементы item[@id=1]/



-------------------
в php:

// xsltProcessor->setParameter('', 'text', '//items/item[@id=1]/')
------------------
в xsl:

<xsl:param name="text" select="//items/item[@id=1]/" />
.
.
.
<xsl:value-of select="$text" />
------------------

все ок выводит элементы //items/item[@id=1]/
-------------------------------------------------

Обясните в чем разница!!!!?????????
crazzzy
Новичок

Зарегистрирован: 21.05.2008
Сообщения: 21
Откуда: Харьков
Посетить сайт автора
[12541] Пт Май 23, 2008 03:05

просто ненадо в xsl файле определять переменную, убери строчку
<xsl:param name="text" />
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[12543] Пт Май 23, 2008 06:02

Разница примерно такая же, как тут (на PHP):

Код:


$param = '$var'
$foo   = $param

vs

$foo   = $var



Передать XPath для вычисления как параметр невозможно, надо искать обходной путь.
crazzzy
Новичок

Зарегистрирован: 21.05.2008
Сообщения: 21
Откуда: Харьков
Посетить сайт автора
[12544] Пт Май 23, 2008 12:54

ничего не понял ...

человек пытался передать через параметр данные в xsl и в самом xsl определял "локальную" переменную с таким же именем - вот оно и не работало, ИМХО

я отписал сюда, несмотря на 2006г топика, только потому, что сам столкнулся с этим вопросом и реализовал у себя.
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[12545] Пт Май 23, 2008 13:16

crazzzy писал(а):

человек пытался передать через параметр данные в xsl и в самом xsl определял "локальную" переменную с таким же именем - вот оно и не работало, ИМХО


Никому этого больше не говори, а лучше почитай доку по <xsl:param>
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
crazzzy
Новичок

Зарегистрирован: 21.05.2008
Сообщения: 21
Откуда: Харьков
Посетить сайт автора
[12547] Пт Май 23, 2008 22:08

но у меня именно так и получилось, отталкивался от этого топика, поэтому и поднял его из небытия:

Код:


  $dom = new domDocument();
  $dom->load($fxsl);

  $proc = new xsltprocessor;
  $proc->setParameter('', 'num', $num);

  $xsl = $proc->importStylesheet($dom);
 
  $xml = new domDocument();
  $xml->load($fxml);
  $string = $proc->transformToXml($xml);
  $string = iconv('utf-8', 'windows-1251', $string);
  echo $string;



Код:


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="table">
    <xsl:for-each select="record">
      <xsl:sort select="@date" data-type="text" order="descending"/>
      <xsl:sort select="@id" data-type="number" order="descending"/>
      <xsl:if test="position() &lt; $num">
        <p class='news' align='left'>*
          <xsl:value-of select="@id" /><xsl:text>, </xsl:text>
          <xsl:value-of select="@date" /><xsl:text>, </xsl:text>
          <xsl:value-of select="notes" /><xsl:text>, </xsl:text>
        </p>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[12549] Сб Май 24, 2008 01:12

crazzzy писал(а):

Код:

<xsl:if test="position() &lt; $num">


Ни один валидатор не пропустит такую строку без предварительного объявления переменной num. У Вас получился невалидный XSL-файл
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
crazzzy
Новичок

Зарегистрирован: 21.05.2008
Сообщения: 21
Откуда: Харьков
Посетить сайт автора
[12550] Сб Май 24, 2008 11:24

тем неменее так работает, а если еще объявляю эту переменную в xsl файле, то перестает работать!
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[12551] Сб Май 24, 2008 13:43

Так может просто руки выпрямить?

PHP manual писал(а):

Example 2665. Changing the owner before the transformation

Код:

<?php

$collections = array(
    'Marc Rutkowski' => 'marc',
    'Olivier Parmentier' => 'olivier'
);

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules

foreach ($collections as $name => $file) {
    // Load the XML source
    $xml = new DOMDocument;
    $xml->load('collection_' . $file . '.xml');

    $proc->setParameter('', 'owner', $name);
    $proc->transformToURI($xml, 'file:///tmp/' . $file . '.html');
}

?>


Разницу видишь? Сначала import, а потом set, а не наоборот, что логично
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[12552] Сб Май 24, 2008 14:25

Vasilisk писал(а):

Разницу видишь? Сначала import, а потом set, а не наоборот, что логично


Даже нет. Работает и так и так
test.php

Код:

<?php

$xsl = new DOMDocument;
$xsl->load('test.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->setParameter('', 'val', 456);
$proc->importStyleSheet($xsl); // attach the xsl rules

    // Load the XML source
$xml = new DOMDocument;
$xml->load('test.xml');

echo $proc->transformToXml($xml);

?>


test.xsl

Код:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="val"/>
 
  <xsl:output encoding="windows-1251" method="html"/>

  <xsl:template match="/Root">
    <html>
      <head>
      </head>
      <body>
        <table border="1">
          <xsl:for-each select="name">
            <tr>
              <td><xsl:value-of select="."/></td>
              <td><xsl:value-of select="$val"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>


text.xml

Код:

<?xml version="1.0" encoding="windows-1251"?>
<Root>
  <name>Name1</name>
  <name>Name2</name>
  <name>Name3</name>
</Root>


out

Код:

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head>
<body><table border="1">
<tr>
<td>Name1</td>
<td>456</td>
</tr>
<tr>
<td>Name2</td>
<td>456</td>
</tr>
<tr>
<td>Name3</td>
<td>456</td>
</tr>
</table></body>
</html>


Так, что ошибка где-то в консерватории
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Гость





[12553] Пн Май 26, 2008 03:32

да, просто добавил объявление
<xsl:param name="num"/>

и ... всеравно работает Wink видно было что-то другое и я было решил ...

виноват, был неправ Smile

но зато топик расписали Wink