如何检查当前元素之前是否存在相同的元素但不共享相同的父元素?
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"/>
来自<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"/>