在我的页面上显示外部 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 & Sides
Air Conditioner
ABS
Central Locking Key
Radio/CD
Cruise Control
Electric Mirrors
Electric Windows - Front & 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 使用 &
实体,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&templatetype=DealershipWebsite&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,可能是因为安全设置)。
所以我目前有一个文档,里面有一堆 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 & Sides
Air Conditioner
ABS
Central Locking Key
Radio/CD
Cruise Control
Electric Mirrors
Electric Windows - Front & 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 使用&
实体,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&templatetype=DealershipWebsite&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,可能是因为安全设置)。