在Erlang中使用xmerl_xpath定位谓词

时间:2012-05-27 17:11:44

标签: xpath erlang

我正在尝试使用xmerl_xpath在Erlang中查询已解析的XML文档,但我无法使位置谓词起作用。我没有返回第n个子元素,而是获取到目前为止所选内容的第n个元素。

示例代码,我想提取值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的包装。)

1 个答案:

答案 0 :(得分:0)

我不知道Erlang,但是第三个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>

如果这不是你得到的,我怀疑你使用的库是错误的。