我在这里和大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);
?>
答案 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>