Как проверить, присутствует ли тот же элемент перед текущим элементом, но у него нет одного и того же родителя?

Можно ли от человека с идентификатором 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, когда я его удаляю, но почему? Я не использую следующий брат, я в замешательстве

Использовать ось preceding? w3.org/TR/2010/REC-xpath20-20101214/#axes

michael.hor257k 05.05.2022 02:05

Извините, что беспокою вас снова, я отредактировал код. Я не понимаю вывод, используя следующий

Tartate 05.05.2022 02:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да. Начиная с 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"/>

Другие вопросы по теме