gpt4 book ai didi

xslt - 如何检查祖先是否是他祖先中该类型的最后一个元素

转载 作者:行者123 更新时间:2023-12-03 16:06:36 26 4
gpt4 key购买 nike

我有以下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元素。

我的目标是删除表格最后一行条目的底部边框。
(TABLE映射到HTML表,ROW映射到HTML tr,ENTRY映射到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中使用一些外部函数,但是我总是得到节点的新引用(即使对于相同的节点),因此无法进行比较。

所以我的问题是-如何比较节点的引用...
或以其他任何方式完成这项工作。

提前致谢 :)。

最佳答案

我的目标是删除最后一行中的底部边框
表。 (TABLE映射到HTML表,ROW映射到HTML tr,ENTRY映射到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)

关于xslt - 如何检查祖先是否是他祖先中该类型的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8603951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com