我有很多类似的文件如下所示。 random0
,random1
和random2
标记的名称因文档而异。列表标签的数量不固定。如何使用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>
答案 0 :(得分:2)
所以打破这个,你需要
list
子项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