2012-05-27 121 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