使用xpath获取第n个最接近的后代

时间:2013-11-10 14:29:19

标签: xml xpath

我有很多类似的文件如下所示。 random0random1random2标记的名称因文档而异。列表标签的数量不固定。如何使用xpath从内容标记中获取第n个最接近的后代列表标记,即n == 1返回1,2,3,10,11, 12;如果n == 2返回4,5,6;等等。注意:最接近的后代列表标记可能是子项,孙项或更进一步。

<?xml version="1.0" encoding="UTF-8"?>
<content>
     <random0>
        <list>1</list>
        <list>2</list>
        <list>3</list>
        <random1>
            <list>4</list>
            <list>5</list>
            <list>6</list>
            <random2>
                <list>7</list>
                <list>8</list>
                <list>9</list>
            </random2>
        </random1>
        <list>10</list>
        <list>11</list>
        <list>12</list>
    </random0>
</content>

1 个答案:

答案 0 :(得分:2)

所以打破这个,你需要

  • 查找具有任何list子项
  • 的所有后代元素,无论其名称如何
  • 选择其中一个 n
  • 提取所有list个孩子
descendant::*[list][$number]/list

或可能

descendant-or-self::*[list][$number]/list

如果您希望允许第一批列表直接位于上下文节点内(例如,如果您从random0开始而不是content)。

XSLT示例

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output indent="yes" />

  <xsl:template match="/">
    <result>
      <xsl:copy-of select="descendant-or-self::*[list][2]/list" />
    </result>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0"?>
<result>
  <list>4</list>
  <list>5</list>
  <list>6</list>
</result>

NB。这是XPath中的一个极端情况之一,它揭示了descendant::.//之间的细微差别。 .//*[list][$num]/list的明显简写descendant::*[list][$num]/list相同,它会选择所有 n <的所有元素 - 列表 - 子元素/ em>在他们各自的父母中的元素与列表 - 孩子,在你的例子中,如果n = 1,则表示所有,否则没有。您必须添加括号才能使其与descendant::版本的行为相同 - (.//*[list])[$num]/list