2014-03-07 26 views
2

使用XSLT 1我希望从XML文档中选择最后一个节点,它位于任何深度,直接由特定类型包含,但本身不属于该类型。XSLT:除了特定类型以外的任何深度的最后一个元素

例如:

<root> 
<div> 
    <p>A node</p> 
</div> 
<div> 
    <p>Another node</p> 
    <div> 
     <p>A third node</p> 
     <div> 
      <p>A fourth node</p> 
      <p>The node <span>sub-element</span> that I want</p> 
     </div> 
    </div> 
</div> 
</root> 

我想获得<p>节点<跨度>,我想在此条件下</P >子元素</SPAN >(重写问题对于这个特定的情况):

选择最后一个节点,在任何深度,由div直接包含,但本身并不是一个div。

答案应该是夺取的任何深度(即,不是 “/ DIV/DIV/DIV/P”)

的<跨度>节点不应当被选择,因为它的父不是一个div

将不胜感激任何帮助!

回答

3

你应该能够得到你想要使用

(//div/*[not(self::div)])[last()] 

//div/*[not(self::div)]给你所有的文档中有一个div的直接孩子,本身并不是一个div任何地方的元素是什么,以及[last()]采最后这些按文件顺序。由于孩子被认为是在父母的文件顺序之后,你可以确定所选元素没有任何div自己有孩子的后代。

括号是重要的,如果你忽略他们,那么你会得到一个非常不同的表达

//div/*[not(self::div)][last()] 

,这将给你每包含的div的最后一个非div子元素的文档各级序列(即[last()]仅适用于路径中的最后一步,而不适用于整个路径)。


平凡的XSLT例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <xsl:copy-of select="(//div/*[not(self::div)])[last()]" /> 
    </xsl:template> 
</xsl:stylesheet> 

输出:

<?xml version="1.0"?> 
<p>The node <span>sub-element</span> that I want</p> 
+0

非常感谢你为这个;这绝对是非常棒的,非常有帮助! –

相关问题