如何检查当前元素之前是否存在相同的元素但不共享相同的父元素?

How to check if the same element is present before current element but that doesn't share the same parent?

来自<listOfPerson>中id为A的人,是否可以检查前面是否有“人”?

在这种情况下,应该是真的,因为<singlePerson>

中有一个人

计算前面的兄弟姐妹在这里不起作用,因为他们不共享同一个父级,我不确定存在什么替代方案

谢谢

<root>
    <singlePerson>
        <person>Z</person>
    </singlePerson>
    <listOfPerson>
        <person>A</person>
        <person>B</person>
        <person>C</person>
    </listOfPerson>
</root>

XSL :

<xsl:template match="root">
    <xsl:variable name="persons" select="descendant::person"/>
    <!-- on person B of <listPerson> -->
    <xsl:value-of select="boolean(($persons[3]/following::person))"/>
</xsl:template>

输出:真

为什么 return true 而不是 false ? <listOfPerson>

后没有包含人的元素

以下似乎指的是 C 因为当我删除它时它 return 是错误的但是为什么?我没有使用 following-sibling 我很困惑

是的。从 B 开始,前面的轴包含 A、Z(直到您通过使用节点选择器之外的任何操作将其变成节点集,此时它将变为 Z、A)——下面的轴包含 C。

除了前后,还有preceding-sibling和following-sibling。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="root">
    <xsl:variable name="persons" select="descendant::person"/>
    <!-- on person B of <listPerson> -->
    <xsl:value-of select="$persons[3]/preceding::person[1]"/>
    <xsl:text>
</xsl:text>    <xsl:for-each select="$persons[3]/preceding::person">
        <xsl:value-of select="."/>
    </xsl:for-each>
    <xsl:text>----</xsl:text>
    <xsl:value-of select="$persons[3]"/>
    <xsl:text>----</xsl:text>
    <xsl:for-each select="$persons[3]/following::person">
        <xsl:value-of select="."/>
    </xsl:for-each>
    <xsl:text>
</xsl:text>
    <xsl:for-each select="$persons[3]/preceding-sibling::person">
        <xsl:value-of select="."/>
    </xsl:for-each>
    <xsl:text>====</xsl:text>
    <xsl:value-of select="$persons[3]"/>
    <xsl:text>====</xsl:text>
    <xsl:for-each select="$persons[3]/following-sibling::person">
        <xsl:value-of select="."/>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

给出此输出:

A
ZA----B----C
A====B====C

嗯,很简单,从 root 的上下文中,表达式 descendant::person 选择 all person 个元素,这些元素是 root - 包括 Z 人。您可以通过检查 count($persons) 的值来验证这一点,这将 return 4.

因此表达式 $persons[3] 指的是 B - 这也很容易通过以下方式验证:

<xsl:value-of select="$persons[3]"/>

所以自然地 $persons[3]/following::person 是 C 人 - 再次证明:

<xsl:value-of select="$persons[3]/following::person"/>