如何使用XSLTranformation提取xhtml meetgrid节?

时间:2015-02-25 04:42:41

标签: html xml xslt xhtml

我想从网站中提取数据,对其进行转换(使用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>&nbsp;&nbsp;<a href="selectevent.php?mref=486">Manifestazione Regionale Cat. C4 – C2 –C1 - R</a></td></tr>
            <tr><td>Mar 07</td><td>&nbsp;&nbsp;<a href="selectevent.php?mref=484">Diving SA State Age Open &amp; Synchro 2015</a></td></tr>
          </table>
          <br /><h3>2014</h3>
          <table class="meetgrid" summary="List of Meets">
            <tr><td>Dec 13</td><td>&nbsp;&nbsp;<a href="selectevent.php?mref=461">Sheffield Santa Skills 2014</a></td></tr>
            <tr><td>Dec 11</td><td>&nbsp;&nbsp;<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 &amp; 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

Extracting data from website with XSLT

How to replace a text in XML file using XSLT

1 个答案:

答案 0 :(得分:1)

  

希望现在的问题更清楚了。我添加了命名空间,   将模板匹配更改为&#34; /&#34;并更改了示例输入和   要求输出。

不幸的是,您的输入仍然不是格式良好的XML,因为(1)它缺少body和两个div元素的结束标记,(2)它包含未声明的实体{ {1}}。

为了推动这一进程:

给出格式良好的输入,例如:

<强> XML

&nbsp;

以下样式表

XSLT 1.0

<!DOCTYPE html [
    <!ENTITY nbsp   "&#160;">
]>
<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>&nbsp;&nbsp;<a href="selectevent.php?mref=486">Manifestazione Regionale Cat. C4 – C2 –C1 - R</a></td>
          </tr>
          <tr>
            <td>Mar 07</td>
            <td>&nbsp;&nbsp;<a href="selectevent.php?mref=484">Diving SA State Age Open &amp; Synchro 2015</a></td>
          </tr>
        </table>
        <br/>
        <h3>2014</h3>
        <table class="meetgrid" summary="List of Meets">
          <tr>
            <td>Dec 13</td>
            <td>&nbsp;&nbsp;<a href="selectevent.php?mref=461">Sheffield Santa Skills 2014</a></td>
          </tr>
          <tr>
            <td>Dec 11</td>
            <td>&nbsp;&nbsp;<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 &amp; 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文档来解码实体。在我的测试中,这是非常慢。