1

我正在尝试使用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 的包装器。)

4

1 回答 1

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>

如果这不是你得到的,我怀疑你使用的库有问题。

于 2012-05-29T20:20:22.430 回答