2011-12-22 37 views
2

我有下面的XML:如何检查是否祖先是在他的祖先类型的最后一个元素

<TABLE> 
    <ROW> 
    <ENTRY/> 
    <ENTRY/> 
    </ROW> 
    <ROW> 
    <ENTRY>xxx</ENTRY> 
    <ENTRY>yyy</ENTRY> 
    </ROW> 
    <Z> 
    <ROW> 
     <ENTRY/> 
     <ENTRY/> 
    </ROW> 
    </Z> 
    <ROW> 
    <ENTRY/> 
    <ENTRY/> 
    </ROW> 
</TABLE> 

表结构可以改变,所以我可以有最后一排包沿Z元素,或有可能根本没有Z元素。

我的目标是删除表中最后一行条目的底部边框。 (表映射到HTML表,行到HTML TR,进入HTML TD)

,所以我尝试使用XSLT模板:

<xsl:template match="ENTRY"> 
    <td> 
    <xsl:if test="(ancestor::ROW[1] = ancestor::TABLE[1]/descendant::ROW[last()])"> 
     <!-- remove the bottom border of td --> 
    </xsl:if> 
    </td> 
</xsl:template> 

但它几乎所有的细胞去除边框表(该边框不会从具有文本内容的单元格中移除)。所以我猜测机制会检查节点是否具有相同的值(名称,文本内容,子元素等) - 不是引用。 我试图在java中使用一些外部函数,但我总是得到一个新的节点引用(即使对于相同的节点),所以我无法比较它。

所以我的问题是 - 如何比较节点的参考... 或以任何其他方式做这项工作。

在此先感谢:)。

回答

4

我的目标是删除 表中最后一行的条目的底部边框。 (表映射到HTML表,行到HTML TR,进入HTML TD)

它似乎想要

<xsl:if test= 
    "generate-id(ancestor::ROW[1]) 
    = 
    generate-id(ancestor::TABLE[1]/descendant::ROW[last()])"> 

    <!-- Processing here --> 
</xsl:if> 

我建议你添加一个新的模板和使用模式匹配(而不是明确的条件)捕捉​​到了这个情况:

<xsl:template match= 
"ENTRY[generate-id(ancestor::ROW[1]) 
     = 
     generate-id(ancestor::TABLE[1]/descendant::ROW[last()]) 
     ]"> 

     <!-- Processing here --> 
</xsl:template> 

你更普遍的问题:

所以我的问题是 - 如何节点

的引用比较在XPath 2.0(XSLT 2.0)使用is操作

$n1 is $n2 

测试两个节点$n1$n2用于节点标识(不是值相等)。

在XPath 1.0(XSLT 1.0):

count($n1|$n2) = 1 

在XSLT 1.0另一种方法是使用标准的XSLT 1.0(在XPath中1不可用。0)函数generate-id(),如在上述溶液中进行:

generate-id($n1) = generate-id($n2) 
0

您的测试(ancestor::ROW[1] = ancestor::TABELA[1]/descendant::ROW[last()])比赛前两个和你的样品中的最后两个ENTRY元素。大概是因为当呈现为字符串时,第一个ROW匹配最后的ROW。见http://www.w3.org/TR/xpath/#booleans

我能够使用选择最后两个条目:

//ENTRY[count(ancestor::ROW[1]/preceding::ROW) = count(ancestor::TABLE[1]/descendant::ROW) - 1] 

所以我想,下面将作为您的测试:

(count(ancestor::ROW[1]/preceding::ROW) = count(ancestor::TABLE[1]/descendant::ROW) - 1) 

更新致谢Dimitre Novatchev和jasso的反馈

这种解决方案并不理想,因为:

  1. 这些计数是低效的,比需要计算更多的事情。
  2. preceding::轴可能会匹配不止TABLE元素的后代当部分较大的文档。
+1

MattH:这样的count()操作通常不是有效的,如果可能的话应该避免。 – 2011-12-22 13:39:10

+0

@DimitreNovatchev:感谢您的反馈。我将留下这个效率低下的解决方案作比较。 – MattH 2011-12-22 14:28:00

+0

关于使用“之前”或“跟随”轴的一般注意事项:它们的问题在于,如果文档中存在重复的类似结构,它们会超出预期范围,从而导致失败。在这种情况下,如果真实用例比给定示例代码更复杂,并且存在多个包含''的'

',那么XPath会失败。用一个'
'这个也可以。 – jasso2011-12-22 18:09:57