2

我有许多类似的文件,如下所示。random0random1random2标签的名称因文档而异。列表标签的数量不固定。我如何使用xpath从内容标签中获取第 n 个最接近的后代列表标签,即 if n == 1return 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>
4

1 回答 1

3

所以打破这个,你需要

  • 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>

注意。这是 XPath 中暴露descendant::.//. 的明显简写.//*[list][$num]/list不会与 相同,而是会挑选出所有元素列表子元素,它们是各自父元素中的第n个元素列表子元素,在您的示例中意味着所有元素如果 n=1,否则什么都没有。您必须添加括号以使其行为与版本相同 -descendant::*[list][$num]/listdescendant::(.//*[list])[$num]/list

于 2013-11-10T14:35:31.827 回答