【问题标题】:Using external XML uri with variables将外部 XML uri 与变量一起使用
【发布时间】:2014-04-26 16:00:21
【问题描述】:

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

【问题讨论】:

    标签: php xml xslt xslt-1.0


    【解决方案1】:

    你在正确的道路上,但是在访问属性值时,你必须在它们前面加上@

    更改这些行

    <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>
    

    【讨论】:

      【解决方案2】:

      您的代码很好,但要获取属性值,您需要在您的 route14.xsl 中为您选择的属性名称加上 @ 前缀

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

      【讨论】:

        猜你喜欢
        • 2013-09-23
        • 2021-02-13
        • 2010-11-27
        • 1970-01-01
        • 2023-03-31
        • 2014-09-05
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多