Можно ли от человека с идентификатором A в <listOfPerson>
проверить, есть ли «человек» раньше?
В данном случае это должно быть правдой, так как в <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>
Вывод: правда
Почему он возвращает true вместо false? После <listOfPerson>
нет элемента, содержащего человека
следующее, похоже, относится к человек С, потому что оно возвращает false, когда я его удаляю, но почему? Я не использую следующий брат, я в замешательстве
Извините, что беспокою вас снова, я отредактировал код. Я не понимаю вывод, используя следующий
Да. Начиная с B, предыдущая ось содержит A, Z (пока вы не превратите ее в набор узлов, сделав с ней что-либо, кроме использования селектора узлов, после чего она станет Z, A), а следующая ось содержит C.
В дополнение к предыдущему и последующему есть также предшествующий брат и сестра.
<?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
выбирает элементы всеperson
, которые являются потомками root
, включая человека Z. Вы можете убедиться в этом, проверив значение count($persons)
, которое вернет 4.
Следовательно, выражение $persons[3]
относится к человеку B, что также легко проверить:
<xsl:value-of select = "$persons[3]"/>
так что, естественно, $persons[3]/following::person
- это человек C - снова доказано:
<xsl:value-of select = "$persons[3]/following::person"/>
Использовать ось
preceding
? w3.org/TR/2010/REC-xpath20-20101214/#axes