2013-07-03 66 views
0

这个查询:YQL列投影使用XPATH

SELECT * 
FROM html 
WHERE url='http://wwww.example.com' 
AND xpath='//tr[@height="20"]' 

返回XML:

<results> 
    <tr height="20"> 
     <td height="20" width="425"> 
      <p>Institution 0</p> 
     </td> 
     <td width="134"> 
      <p>Minneapolis</p> 
     </td> 
     <td width="64"> 
      <p>MN</p> 
     </td> 
    </tr> 
    ... 
</results> 

问题:

  • 是否有使用XPath创建单独列的方式吗?
  • 有没有办法创建列别名?

例(无效的语法):

SELECT td[position()=1]/p/. AS name, td[position()=2]/p/. AS city, td[position()=3]/p/. AS region 
FROM ... 

目标:

<results> 
    <tr height="20"> 
     <name>Institution 0</name> 
     <city>Minneapolis</city> 
     <region>MN</region> 
    </tr> 
    ... 
</results> 

回答

1

不使用XPath,因为你正在尝试做的。然而,可以使用YQL将XSL Transformations应用于XML/HTML文档。这里有一个例子:

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <rows> 
      <xsl:apply-templates select="descendant::tr" /> 
     </rows> 
    </xsl:template> 
    <xsl:template match="//tr"> 
     <row> 
      <name> 
       <xsl:value-of select="td[1]/p" /> 
      </name> 
      <city> 
       <xsl:value-of select="td[2]/p" /> 
      </city> 
      <region> 
       <xsl:value-of select="td[3]/p" /> 
      </region> 
     </row> 
    </xsl:template> 
</xsl:stylesheet> 

HTML

<html> 
    <body> 
     <table> 
      <tr height="20"> 
       <td height="20" width="425"> 
        <p>Institution 0</p> 
       </td> 
       <td width="134"> 
        <p>Minneapolis</p> 
       </td> 
       <td width="64"> 
        <p>MN</p> 
       </td> 
      </tr> 
      <tr height="20"> 
       <td height="20" width="425"> 
        <p>Institution 1111</p> 
       </td> 
       <td width="134"> 
        <p>Minneapolis 1111</p> 
       </td> 
       <td width="64"> 
        <p>MN 11111</p> 
       </td> 
      </tr> 
     </table> 
    </body> 
</html> 

YQL查询

select * from xslt where stylesheet="url/to.xsl" and url="url/to.html" 

YQL结果

<results> 
    <rows> 
     <row> 
      <name>Institution 0</name> 
      <city>Minneapolis</city> 
      <region>MN</region> 
     </row> 
     <row> 
      <name>Institution 1111</name> 
      <city>Minneapolis 1111</city> 
      <region>MN 11111</region> 
     </row> 
    </rows> 
</results> 

»See an example running in the YQL console.

+0

好主意!我希望我在文档中看到了这一点。也有一个upvote。 – craig

+0

我是否也应该能够在YQL查询中添加一个'xpath'过滤器?例如'AND xpath ='// tr [@ height =“20”]''? – craig

+0

“xslt”表没有'xpath'参数。 – salathe