使用带有变量的外部XML uri

时间:2014-03-20 02:28:37

标签: php xml xslt xslt-1.0

我在这里和大G上搜索,我愿意学习,但我还没有找到答案。

我正在尝试使用XSLT转换外部XML数据,以便在HTML或PHP中轻松读取。我测试了一些东西,并成功地使用XSL和PHP转换了一些简单的XML文件。问题是我需要使用的实际XML文件实际上并不是我们通常看到的典型的点xml文件,但更像是“http://webservices.nextbus.com/service/publicXMLFeed?command=vehicleLocations&a=sf-muni&r=14&t=0”格式。当我使用这些地址时,似乎正确读取这些文件和XSL样式表,解析正确数量的表格单元格,但将它们返回为空。

怎么了?

此外,它是否与外部网站使用的xml格式有关?我注意到他们的XML更像是“XHTML样式”,而不是我过去看过的其他文件。

他们的风格使用一个大标签并用斜线封闭:

<vehicle id="5464" routeTag="14" dirTag="14_IB2" lat="37.7637" lon="-122.4087" secsSinceReport="86" predictable="true" heading="218" speedKmHr="0"/>

同样的例子,如果是使用usua树写的话:

<vehicle> <id>5464</id> <routeTag>14</routeTag> <dirTag>14_IB2</dirTag> ... </vehicle>

route14.xsl:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>Route 14</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">Vehicle</th>
      <th style="text-align:left">Direction</th>
    </tr>
    <xsl:for-each select="body/vehicle">
    <tr>
      <td><xsl:value-of select="id" /></td>
      <td><xsl:value-of select="dirTag" /></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>   

PHP代码:

<?php
// Load XML file
$xml = new DOMDocument;
$xml->load('http://webservices.nextbus.com/service/publicXMLFeed?command=vehicleLocations&a=sf-muni&r=14&t=0');

// Load XSL file
$xsl = new DOMDocument;
$xsl->load('route14.xsl');

// Configure the transformer
$proc = new XSLTProcessor;

// Attach the xsl rules
$proc->importStyleSheet($xsl);

echo $proc->transformToXML($xml);
?> 

2 个答案:

答案 0 :(得分:2)

您位于正确的路径上,但在访问属性值时,您必须在其前面添加@

更改这些行

<tr>
  <td><xsl:value-of select="id" /></td>
  <td><xsl:value-of select="dirTag" /></td>
</tr>

<tr>
  <td><xsl:value-of select="@id" /></td>
  <td><xsl:value-of select="@dirTag" /></td>
</tr>

答案 1 :(得分:1)

您的代码很好,但要获取属性值,您需要在route14.xsl中用@替换所选属性名称

<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="@dirTag" /></td>