我想从网站中提取数据,对其进行转换(使用xsl)并以XML格式获取输出。 为什么我的xsl没有转换XML来获得所需的输出?
我用来测试转换的 XML 如下:
<?xml version= "1.0"?>
<?xml-stylesheet type="text/xsl" href="diverecorder.xsl"?>
<head>
<body>
<div id="container">
<div id="content">
<br/><h3>2015</h3>
<table class="meetgrid" summary="List of Meets">
<tr><td>Mar 08</td><td> <a href="selectevent.php?mref=486">Manifestazione Regionale Cat. C4 – C2 –C1 - R</a></td></tr>
<tr><td>Mar 07</td><td> <a href="selectevent.php?mref=484">Diving SA State Age Open & Synchro 2015</a></td></tr>
</table>
<br /><h3>2014</h3>
<table class="meetgrid" summary="List of Meets">
<tr><td>Dec 13</td><td> <a href="selectevent.php?mref=461">Sheffield Santa Skills 2014</a></td></tr>
<tr><td>Dec 11</td><td> <a href="selectevent.php?mref=460">2014/15 Australian Open Championships</a></td></tr>
</table>
</html>
这是直接来自一个网站,除了编辑的前三行连接到diverecorder.xsl文件以测试xsl转换。信息将与样本重复相同,主要变化是&#34; mref =&#34;之后的数字。
以下是 XSL 代码,用于尝试从网站中确定meetgrid和h3部分并对其进行转换。
<?xml version="1.0" encoding="UTF-8"?
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:soap="http://soap/envelope/">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<body>
<xsl:for-each select="body/div">
<event>
<xsl:for-each select="div">
<xsl:if test="h3">
<yearRange>
<xsl:value-of select="translate(normalize-space(.), ' ', ',')" />
</yearRange>
</xsl:if>
<xsl:if test="@class='meetgrid'">
<eventmonthDay>
<xsl:value-of select="tr/td" />
</eventmonthDay>
<eventUrl>
<xsl:value-of select="substring-before(a/@href, '/event/')" />/download/<xsl:value-of select="substring-after(a/@href, '/event/')" />multi/
</eventUrl>
<eventTitle>
<xsl:value-of select="/a" />
</eventTitle>
</xsl:if>
</xsl:for-each>
</event>
</xsl:for-each>
</body>
</xsl:template>
</xsl:stylesheet>
当前输出是选择见面。
期望/期望的输出,目前我还没有。
<head>
<body>
<year>
2015
</year>
<eventmonthday>Mar 08</eventmonthday><event>Manifestazione Regionale Cat. C4 – C2 –C1 - R</event>
<eventmonthday>Mar 07</eventmonthday><event>Diving SA State Age Open & Synchro 2015</event>
...
<year>
2014
</year>
<eventmonthday>Dec 13</eventmonthday><event>Sheffield Santa Skills 2014</event>
<eventmonthday>Dec 11</eventmonthday><event>2014/15 Australian Open Championships</event>
...
</body>
</head>
注意: 我想要提取的内容的完整来源是view-source:http://www.diverecorder.co.uk/meetexplorer/selectmeet.php
我用来查看转换是否正常的测试是 - 创建diverecorder.xml和diverecorder到xsl并在Internet Explorer中运行xml文件以检查转换是否正常工作。
我看过类似的问题,但我无法解决问题包括: How to extract a div section from one xhtml document into another xhtml document
答案 0 :(得分:1)
希望现在的问题更清楚了。我添加了命名空间, 将模板匹配更改为&#34; /&#34;并更改了示例输入和 要求输出。
不幸的是,您的输入仍然不是格式良好的XML,因为(1)它缺少body
和两个div
元素的结束标记,(2)它包含未声明的实体{ {1}}。
为了推动这一进程:
给出格式良好的输入,例如:
<强> XML 强>
以下样式表:
XSLT 1.0
<!DOCTYPE html [
<!ENTITY nbsp " ">
]>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head/>
<body>
<div id="container">
<div id="content">
<br/>
<h3>2015</h3>
<table class="meetgrid" summary="List of Meets">
<tr>
<td>Mar 08</td>
<td> <a href="selectevent.php?mref=486">Manifestazione Regionale Cat. C4 – C2 –C1 - R</a></td>
</tr>
<tr>
<td>Mar 07</td>
<td> <a href="selectevent.php?mref=484">Diving SA State Age Open & Synchro 2015</a></td>
</tr>
</table>
<br/>
<h3>2014</h3>
<table class="meetgrid" summary="List of Meets">
<tr>
<td>Dec 13</td>
<td> <a href="selectevent.php?mref=461">Sheffield Santa Skills 2014</a></td>
</tr>
<tr>
<td>Dec 11</td>
<td> <a href="selectevent.php?mref=460">2014/15 Australian Open Championships</a></td>
</tr>
</table>
</div>
</div>
</body>
</html>
将生成结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="x">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<head>
<body>
<xsl:for-each select="x:html/x:body/x:div/x:div/x:table">
<year>
<xsl:value-of select="preceding-sibling::x:h3[1]"/>
</year>
<xsl:for-each select="x:tr">
<eventmonthday>
<xsl:value-of select="x:td[1]"/>
</eventmonthday>
<event>
<xsl:value-of select="x:td[2]/x:a"/>
</event>
</xsl:for-each>
</xsl:for-each>
</body>
</head>
</xsl:template>
</xsl:stylesheet>
某些处理器(例如Saxon)能够处理包含HTML实体的文档而不明确声明它们,而是指向特定的DTD,例如:
<?xml version="1.0" encoding="UTF-8"?>
<head>
<body>
<year>2015</year>
<eventmonthday>Mar 08</eventmonthday>
<event>Manifestazione Regionale Cat. C4 – C2 –C1 - R</event>
<eventmonthday>Mar 07</eventmonthday>
<event>Diving SA State Age Open & Synchro 2015</event>
<year>2014</year>
<eventmonthday>Dec 13</eventmonthday>
<event>Sheffield Santa Skills 2014</event>
<eventmonthday>Dec 11</eventmonthday>
<event>2014/15 Australian Open Championships</event>
</body>
</head>
他们将通过查阅在DOCTYPE声明中的URL处找到的实际DTD文档来解码实体。在我的测试中,这是非常慢。