Передача переменных в XSLT - PullRequest
4 голосов
/ 14 мая 2009

Я новичок в XML / XSL. Я хочу иметь возможность передать переменную в строке правила и получить правильные данные.

Прямо сейчас у меня есть этот PHP:

<?php
$params = array('id' => $_GET['id']);

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

$xmlDoc = new DOMDocument(); 
$xmlDoc->load("test.xml");

$xsltProcessor = new XSLTProcessor(); 
$xsltProcessor->registerPHPFunctions(); 
$xsltProcessor->importStyleSheet($xslDoc); 

foreach ($params as $key => $val)
    $xsltProcessor->setParameter('', $key, $val);

echo $xsltProcessor->transformToXML($xmlDoc);
?>

Мой XML-файл выглядит так:

<Profiles> 
  <Profile> 
    <id>1</id> 
    <name>john doe</name> 
    <dob>188677800</dob> 
  </Profile> 
  <Profile> 
    <id>2</id> 
    <name>mark antony</name> 
    <dob>79900200</dob> 
  </Profile> 
  <Profile> 
    <id>3</id> 
    <name>neo anderson</name> 
    <dob>240431400</dob> 
  </Profile> 
  <Profile> 
    <id>4</id> 
    <name>mark twain</name> 
    <dob>340431400</dob> 
  </Profile> 
  <Profile> 
    <id>5</id> 
    <name>frank hardy</name> 
    <dob>390431400</dob> 
  </Profile> 
</Profiles> 

А мой xsl выглядит так

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:param name="id" />

  <xsl:template match="*">
    <html><body>
    <h2>Profile</h2>
    <table cellspacing="1" cellpadding="5" border="1"> 
      <caption>User Profiles</caption> 
      <tr><th>ID</th><th>Name</th><th>Date of Birth</th></tr> 

      <xsl:for-each select="/Profiles/Profile[id='$id']">
        <tr> 
          <td><xsl:value-of select="id"/></td> 
          <td><xsl:value-of select="php:function('ucwords', string(name))"/></td> 
          <td><xsl:value-of select="php:function('date', 'jS M, Y', number(dob))"/></td> 
        </tr> 
      </xsl:for-each> 
    </table> 
    </body></html>
  </xsl:template>
</xsl:stylesheet>

Когда я проверяю URL следующим образом:

http://foo.com/sanbox/index.php?id=2

Я получаю только:

Profile
User Profiles ID    Name    Date of Birth.

Ответы [ 4 ]

7 голосов
/ 15 мая 2009

Ошибка в том, что вы не указали правильное пространство имен.

В вашей декларации таблицы стилей xsl: xmlns: php = "http://php.net/xsl"

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl"
>
3 голосов
/ 14 мая 2009

В выражении XPATH не должно быть никаких кавычек вокруг имени переменной $ id, поэтому оно должно выглядеть так:

<xsl:for-each select="/Profiles/Profile[id=$id]"> 

Кроме того, вы можете поместить <xsl:value-of select="$id"/> в документ, чтобы убедиться, что значение передается.

1 голос
/ 15 мая 2009

Эй, я также новичок в реализации xsl / xml, но я немного поигрался с вашим кодом, я не смог заставить его работать, но даже если вы измените

<xsl:for-each select="/Profiles/Profile[id='$id']">

до

<xsl:for-each select="/Profiles/Profile[id='2']">

Вы по-прежнему получаете неприятную ошибку, хотя она получает правильную информацию. Если вы удалите любое "" или даже "с чем-либо, кроме числового, это даст больше ошибок Я нашел другой способ сделать это, хотя у меня не было времени, чтобы проверить это. XSLT на стороне клиента

У меня та же проблема, что и у вас, и я действительно хотел бы, чтобы эта проблема была решена.

Предупреждение: XSLTProcessor :: transformToXml () [xsltprocessor.transformtoxml]: xmlXPathCompOpEval: функция-функция связана с неопределенным префиксом php в E: \ xampplite \ htdocs \ XSL \ index.php в строке 17

Предупреждение: XSLTProcessor :: transformToXml () [xsltprocessor.transformtoxml]: xmlXPathCompiledEval: 1 объектов осталось в стеке. в E: \ xampplite \ htdocs \ XSL \ index.php в строке 17

Предупреждение: XSLTProcessor :: transformToXml () [xsltprocessor.transformtoxml]: xmlXPathCompOpEval: функция-функция связана с неопределенным префиксом php в E: \ xampplite \ htdocs \ XSL \ index.php в строке 17

Предупреждение: XSLTProcessor :: transformToXml () [xsltprocessor.transformtoxml]: xmlXPathCompiledEval: в стеке осталось 2 объекта. в E: \ xampplite \ htdocs \ XSL \ index.php в строке 17

Профиль

Профили пользователей Имя Имя Дата рождения 2 знака Антоний 79900200

0 голосов
/ 17 августа 2016

Есть несколько проблем, мешающих его работе, некоторые уже упоминались ..

Пространство имен, как указано выше:

<stylesheet xmlns:php="http://php.net/xsl"

Для каждого ... Я склонен использовать:

<xsl:template match="/">

тогда

<xsl:for-each select="Profiles/Profile[id=$id]">

Кроме того, кавычки не были правильными, как и выше, идентификатор не нуждается в ''

С этими тремя изменениями это работает ....

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