【问题标题】:Display an External XML Sheet on my page to Translate to XSL在我的页面上显示一个外部 XML 表以转换为 XSL
【发布时间】:2015-01-29 06:54:44
【问题描述】:

所以我目前有一个文档,其中包含一堆 XML。如下所列

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="datalog.xsl"?>
<ROOT>
<Vehicle>
    <ADGCode>44095650</ADGCode>
    <Brand>Mercedes Benz</Brand>
    <Model>ML 63 AMG (375 kW)</Model>
    <NewUsed>Used</NewUsed>
    <Year>2007</Year>
    <Mileage>166000</Mileage>
    <Price>289990</Price>
    <Colour>Black</Colour>
    <StockNo/>

    <Extras>Airbag - Driver, Pass &amp; Sides
    Air Conditioner
    ABS
    Central Locking Key
    Radio/CD
    Cruise Control
    Electric Mirrors
    Electric Windows - Front &amp; Back
    Heated Front Seats
    Multi-function Steering Wheel
    Navigation System
    Power Steering
    Sunroof - Electric
    Xenon Headlights
    </Extras>

</Vehicle>

它像这样在 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>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
        <th>Image</th>
      <th>ADG Code</th>
      <th>Brand</th>
      <th>Model</th>
      <th>New / Used</th>
      <th>Year</th>
      <th>Mileage</th>
      <th>Price</th>
      <th>Colour</th>
    </tr>
    <xsl:for-each select="ROOT/Vehicle">
    <tr>
        <td>
        <img width="200px">
            <xsl:attribute name="src">
              <xsl:value-of select="Images/Image"/>
            </xsl:attribute>
        </img>
    </td>   
      <td><xsl:value-of select="ADGCode"/></td>
      <td><xsl:value-of select="Brand"/></td>
      <td><xsl:value-of select="Model"/></td>
      <td><xsl:value-of select="NewUsed"/></td>
      <td><xsl:value-of select="Year"/></td>
      <td><xsl:value-of select="Mileage"/></td>
      <td><xsl:value-of select="Price"/></td>
      <td><xsl:value-of select="Colour"/></td>
    </tr>
    <tr>
        <td colspan="9"><xsl:value-of select="Extras"/></td>
    </tr>
    <br />
    </xsl:for-each>
  </table>

  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

但我想知道的是如何修改 XML 文档以从托管在供应商提供的网站上的实时 XML 表中读取链接,以从他们的数据库中显示他们的二手车?

我不确定它是不是很简单,而不是把链接放在 XML 文档上,还是我必须做其他事情?我在网络上的其他任何地方都找不到答案。

我们将不胜感激您的帮助和指导。

【问题讨论】:

  • 要回答您的问题,我们需要查看另一个(托管)XML 文档的示例,以及转换的预期(组合)输出。

标签: xml xslt hyperlink


【解决方案1】:

您可以使用xi:include 来引用必须包含在您的 XML 输入中的外部 xml 内容:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="datalog.xsl"?>
<ROOT>
    <!-- external xml content -->
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
        href="http://url.of.your/external/xml/content" parse="xml"/>
    <!-- your local xml content -->
    <Vehicle>
      <ADGCode>44095650</ADGCode>
      <Brand>Mercedes Benz</Brand>
      ...
    </Vehicle>
</ROOT>

请注意,要使此解决方案起作用:

  • URL 查询字符串中的&amp;amp; 字符必须是正确的escaped,使用&amp;amp; 实体,才能使XML 格式正确
  • xi:include 必须由您的 xslt 处理器支持(对于 Saxon,您必须使用 -xi 命令行选项)
  • 您可能需要调整 xslt 转换

例如,如果外部 xml 具有与本地相同的结构(ROOT 文档元素和 Vehicle 子元素),则组合 xml 将如下所示:

<ROOT>
    <!-- external xml content -->
    <ROOT>
        <Vehicle>
            <ADGCode>65897159</ADGCode>
            ...
        </Vehicle>
    </ROOT>
    <!-- your local xml content -->
    <Vehicle>
      <ADGCode>44095650</ADGCode>
      <Brand>Mercedes Benz</Brand>
      ...
    </Vehicle>
</ROOT>

所以你的xsl:for-each 循环应该是:

<xsl:for-each select="//Vehicle">
    ...
</xsl:for-each>

为了匹配任意深度的Vehicle元素。

编辑:

评论澄清了问题是关于如何将本地 XSLT 应用于远程 XML(我最初误解了输入是本地 XML + 远程 XML)。

所以,这个问题与How to apply XSLT on XML with just XInclude 非常相似,the answer to a different question 的答案是同一个用户Sean B. Durkin

使用这种方法,您的输入文件很简单:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
    href="http://www.carfind.co.za/xmlfeeds/pickup.aspx?feedid=352&amp;templatetype=DealershipWebsite&amp;accesskey=9A6A5A7C" 
    parse="xml"/>

为了匹配xi:include 元素,XSLT 需要稍作修改:

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

<xsl:output method="html"/>

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)]">
  <xsl:apply-templates select="document(@href)" />
</xsl:template>

<xsl:template match="ROOT">
  <html>
      ...
      <xsl:for-each select="Vehicle">
          ...
      </xsl:for-each>
      ...
  </html>
</xsl:template>
</xsl:stylesheet>

现在,您可以在浏览器中打开您的最小 XML 文件,结果 应该 是预期的结果(它可能取决于浏览器;在我的 Mac 上,它适用于 Safari,但不适用于Firefox,可能是因为安全设置)。

【讨论】:

  • 我这样做了,我似乎在我的 XML Feeds live URL 上收到了这个错误。 XML 解析错误:格式不正确 位置:file:///C:/Users/Media/Desktop/datalog.xml 第 5 行,第 84 列:href="carfind.co.za/xmlfeeds/…" parse="xml"/> -- -------------------------------------------------- -------------------------------------------^ 面包屑末尾的向上箭头指向经销商之前的 = 符号。
  • URL 中的 &amp;amp; 字符必须替换为 &amp;amp; 以使 XML 格式正确:&lt;xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="http://www.carfind.co.za/xmlfeeds/pickup.aspx?feedid=352&amp;amp;templatetype=DealershipWebsite&amp;amp;accesskey=9A6A5A7C" parse="xml"/&gt; (I'm going to update the answer)
  • 只是要明确一点,我实际上不希望有任何本地内容。但外部结构相同。所以我添加了这个 w3.org/2001/XInclude" href=" carfind.co.za/xmlfeeds/…" parse="xml"/> 但是当我预览它时什么都没有显示?我在这里做错了什么吗?非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多