Форум программистов, компьютерный форум, киберфорум
XML/XSL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
14 / 10 / 4
Регистрация: 19.07.2016
Сообщений: 101

Найти все узлы, которые содержат текст, но не в потомках узлов класса termin

31.03.2023, 16:38. Показов 908. Ответов 1

Студворк — интернет-сервис помощи студентам
В XML-е нужно выбрать все узлы с классами @class='section' or @class='app-section' or @class='reference-section', в которых содержится текст из поля поиска, например текст "термин", но туда не должны попасть узлы, в которых искомый текст находится внутри div класса @class="termin". То есть
выбраны <div id="1" class="app-section">, <div id="2" class="reference-section">, <div id="4" class="section"> - div с id = 4 должен быть выбран, поскольку в нём текст находится в элементе-сиблинге div с классом @class="termin".
XML имеет примерно такую структуру
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<document>
   <div id="1" class="app-section">
      <div class="reference">
          <p>База терминов</p>
      </div>
      <div class="paragraph">
          >База терминов</е>
      </div>
   </div>
   <div id="2" class="reference-section">
      <div class="paragraph">
         >База терминов</е>
      </div>
      <div class="paragraph">
         <p>База терминов</p>
      </div>
   </div>
   <div id="3" class="section">
      <div class="termin">
         <p>Терминология производства</p>
      </div>
      <div class="termin">
         <p>Сущность терминологии производства</p>
      </div>
   </div>
   <div id="4" class="section">
      <par>База терминов</par>
      <div class="termin">
         <p>Терминология производства</p>
      </div>
      <div class="termin">
         <p>Сущность терминологии производства</p>
      </div>
   </div>
</document>
$SearchString - текст
Нужно выполнить query запрос по строке. Есть вот такой кверистринг
PHP
1
2
3
4
$querystring = "//*[contains(translate(text(), "
                                . "'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', "
                                . "'abcdefghijklmnopqrstuvwxyzабвгдеёжзиклмнопрстуфхцчшщъыьэюя'),". $SearchString .") " .
                            "and (@class='section' or @class='app-section' or @class='reference-section')]";
Но как туда прилепить исключение для строк внутри класса термин?
Пробовал копать с
PHP
1
and not(ancestor::*[@class='termin'])
и варьировать оси с descendant и с применением self, но нужно что-то другое, вроде contains(not in descendant::/@class)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2023, 16:38
Ответы с готовыми решениями:

Найти сумму значений, которые записаны в правых потомках узлов для заданного двоичного дерева для целых чисел
Найти сумму значений, которые записаны в правых потомках узлов для заданного двоичного дерева для целых чисел.

Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз
1.Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз. Пример. Текст: &quot;to be or not to...

Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз
Задача 1.Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз. Пример. Текст: &quot;to be or not...

1
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
02.04.2023, 12:38
Fck_This, сразу оговорюсь, что идея отбирать узлы с таким сложным условием с помощью одного-единственного XPath-выражения лично мне удачной не кажется. Однако мне просто было интересно насколько это возможно и насколько сложно, поэтому я малость поковырялся. Проверить на пхп у меня возможности нет, поэтому написал в виде XSLT, но нужное выражение там присутствует, правда я туда вместо алфавитов засунул переменные, но в общем и целом логика должна быть понятной. Выглядит довольно монструозно и как по мне - не очень надежно, но вроде работает.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
 
    <xsl:template match="/">
        <result>
            <xsl:variable name="SearchString" select="'термин'"/>
            <xsl:variable name="ALPHA" select="ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"/>
            <xsl:variable name="alpha" select="abcdefghijklmnopqrstuvwxyzабвгдеёжзиклмнопрстуфхцчшщъыьэюя"/>
            <xsl:apply-templates select="//*[(@class='section' or @class='app-section' or @class='reference-section')][.//
                *[contains(translate(.//text()[not(ancestor::*[@class='termin'])], $ALPHA, $alpha), $SearchString )]]"/>
        </result>
    </xsl:template>
</xsl:stylesheet>
Данное преобразование отобрало вроде как нужные узлы, вот результат
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<result>
   <div id="1" class="app-section">
      <div class="reference">
         <p>База терминов</p>
      </div>
      <div class="paragraph">
         >База терминов</е>
      </div>
   </div>
   <div id="2" class="reference-section">
      <div class="paragraph">
         >База терминов</е>
      </div>
      <div class="paragraph">
         <p>База терминов</p>
      </div>
   </div>
   <div id="4" class="section">
      <par>База терминов</par>
      <div class="termin">
         <p>Терминология производства</p>
      </div>
      <div class="termin">
         <p>Сущность терминологии производства</p>
      </div>
   </div>
</result>
Добавлено через 2 минуты
Если есть возможность отбирать с помощью XSLT, то можно сделать лучше, да и использование выражений типа .//text()[not(ancestor::*[@class='termin'])] помимо всего прочего еще и с точки зрения производительности - не лучшая затея.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2023, 12:38
Помогаю со студенческими работами здесь

Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз
Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз

Изъять все слова, которые содержат текст
Доброго времени суток уважаемые форумчане! Выручайте, завтра последний зачет, а нужно еще сделать 2 задания :) Надеюсь кто то поможет. ...

создании узлов в дереве(treeView1), через текст бокс(textBox1) создавались уникальные узлы
Ну так вот... Не могу сделать так, что бы при создании узлов в дереве(treeView1), через текст бокс(textBox1) создавались уникальные узлы,...

Удалить все файлы, которые содержат в ячейке А1 указанный текст
Подскажите Пожалуйста! Есть много файлов ексель нужно удалить все файлы которые содержат в ячейке А1 &quot;R‡ZuWGc!С&quot; После...

Удалить всё, кроме параграфов, которые содержат введённый текст
Доброго времени суток! Подскажите, пожалуйста: Есть макрос, который удаляет параграфы, содержащие определённый текст Sub...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru