在我的页面上显示外部 XML Sheet 以转换为 XSL

Display an External XML Sheet on my page to Translate to XSL

所以我目前有一个文档,里面有一堆 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 sheet 中读取 link供应商让我展示他们数据库中的二手车?

我不确定这是否简单,而不是将 link 放在 XML 文档中,还是我必须做其他事情?我无法在网络上的其他任何地方找到答案。

非常感谢您的帮助和指导。

您可以使用 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 的查询字符串中的 & 字符必须正确 escaped 使用 &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, whose answer refers to the answer to a different question by the same user, 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"/>

XSLT 需要稍微修改以匹配 xi:include 元素:

<?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,可能是因为安全设置)。