Автор |
Сообщение |
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() < $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() < $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"/>
и ... всеравно работает видно было что-то другое и я было решил ...
виноват, был неправ
но зато топик расписали
|