2012-05-27 47 views
1

我試圖用xmerl_xpath在Erlang中查詢已解析的XML文檔,但我無法獲取位置謂詞的工作方式。我沒有返回第n個子元素,而是獲得了迄今爲止所選內容的第n個元素。在Erlang中使用xmerl_xpath定位謂詞

示例代碼,在這裏我想提取值11和21(「第一列」):

{XML,_} = xmerl_scan:string(
    "<table>" ++ 
     "<row><el>11</el><el>12</el></row>" ++ 
     "<row><el>21</el><el>22</el></row>" ++ 
    "</table>"). 

4 = length(xmerl_xpath:string("//table/row/el", XML)). % OK 
1 = length(xmerl_xpath:string("(//table/row/el)[1]", XML)). % OK 
1 = length(xmerl_xpath:string("//table/row/el[1]", XML)). % Why not 2? 

是最後一個查詢的結果預期?在一般情況下,使用xmerl_path提取第n個孩子的正確方法是什麼?

(我真正想要做的是使用mochiweb_html解析HTML和使用mochiweb_xpath查詢,但後者基本上是圍繞xmerl_xpath的包裝。)

+0

我會使用erlsom庫處理任何與erlang中的XML有關的事情(http://erlsom.sourceforge.net/)。其更穩定,更多的副作用免費和文件是明確的。 xmerl真的很棘手 –

+0

謝謝,但erlsom的文檔建議使用xmerl附帶的xpath函數...(我的問題是查詢,而不是解析。) – goralmesh

回答

0

我不知道二郎,但第三XPath的的確應該提取的第一列 - 兩個節點<el>11</el><el>21</el> - 我創建了一個簡單的測試XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
    <root> 
     <xsl:for-each select="//table/row/el[1]"> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 

施加到

<table> 
    <row> 
    <el>11</el> 
    <el>12</el> 
    </row> 
    <row> 
    <el>21</el> 
    <el>22</el> 
    </row> 
</table> 

生產:

<root> 
    <el>11</el> 
    <el>21</el> 
</root> 

如果這不是你得到我懷疑你正在使用的庫是馬車。

+0

我想你是對的:它可能是一個錯誤。多麼令人沮喪。 – goralmesh