Форум программистов, компьютерный форум, киберфорум
XML/XSL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 4
1

Как построить логику (выборку по нескольким критериям)

23.08.2019, 10:24. Показов 1875. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Есть xml файл (счет фактура формализованная). Необходимо чтобы логика xsl выбирала некоторые адреса + содержание вхождения по 1-му слову в любой строке и присваивала в таком случае true, если это условие не выполняется, то false. Вот такая конструкция срабатывает только по первой строке:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:ext="urn:ext">
                <xsl:output indent="yes" />
                <xsl:template match="/">
                               <xsl:choose>
             <xsl:when test= "(contains(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф/@АдрТекст, 'узулук') or contains(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф/@АдрТекст, 'орочинская'))and (contains(Файл/Документ/ТаблСчФакт/СведТов/@НаимТов,'обсадн'))">
                <XsltFilterResult>
                    <IsAccepted>true</IsAccepted>
                </XsltFilterResult>
            </xsl:when>
               <xsl:otherwise>
                <XsltFilterResult>
                    <IsAccepted>false</IsAccepted>
                </XsltFilterResult>
               </xsl:otherwise>
         </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
Вопрос, как сделать, чтобы если в любой строке при встрече вхождения 'обсадн' + вхождение в адрес определенных значений- срабатывала логика true. А если во всех строках в сведении о товарах нет этого вхождения, то false.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2019, 10:24
Ответы с готовыми решениями:

Как сделать выборку используя PDO по нескольким критериям ?
Добрый час ! подскажите пожалуйста, как сделать правильный запрос используя PDO ? на данный момент...

Как реализовать поиск по нескольким критериям?
Добрый день! Подскажите пожалуйста, как сделать поиск по кнопке, по нескольким критериям? У меня...

Как реализовать проверку введенных данных в Java по нескольким критериям?
Мне нужно сделать функцию, которая бы считывала переменную с консоли и производила проверку этой...

Как ADO найти и выгружает строки по нескольким критериям из одной книги excel в другую
Доброго времени суток, форумчане! Кто знает, подскажите пожалуйста, как с помощью ADO открыть...

7
203 / 184 / 42
Регистрация: 23.10.2015
Сообщений: 778
23.08.2019, 13:16 2
в xpath есть функция not(); которая равнозначна !=... т.е. ты пишешь выражение на совпадение и всё это отрицаешь функцией not().
вот примерно так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:ext="urn:ext">
<xsl:output indent="yes" />
<xsl:template match="/">
<xsl:choose>
<xsl:when test= "(contains(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф/@АдрТекст, 'узулук') or contains(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф/@АдрТекст, 'орочинская'))and (contains(Файл/Документ/ТаблСчФакт/СведТов/@НаимТов,'обсадн'))">
<XsltFilterResult>
<IsAccepted>true</IsAccepted>
</XsltFilterResult>
</xsl:when>
<xsl:when test= "not((contains(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф/@АдрТекст, 'узулук')) or not(contains(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф/@АдрТекст, 'орочинская'))and (contains(Файл/Документ/ТаблСчФакт/СведТов/@НаимТов,'обсадн')))">
<XsltFilterResult>
<IsAccepted>false</IsAccepted>
</XsltFilterResult>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
1
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 4
23.08.2019, 14:31  [ТС] 3
Немного не то. В xml есть строка с адресом. Она одна. И есть много строк с наименованиями товаров. Необходимо воспроизвести логику такого вида, что если в строке с адресом имеем некоторые вхождения и + к этому в любой строке с товарами встречается определенное вхождение - тогда true, иначе false. Тут в добавок к определенному условию по адресу, как-то перебор строк по товарам нужно реализовать и если находится первое попавшееся вхождение - то общая логика в true, если в добавок к адресу в строках вхождение не находит - то false.
0
203 / 184 / 42
Регистрация: 23.10.2015
Сообщений: 778
23.08.2019, 22:46 4
Алексей Бергамо, сложно но можно... я тебе рекомендовал бы использовать xquery - это я зык запросов. Вот ссылка на хороший и халявный инструмент
http://basex.org/download/
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
25.08.2019, 07:34 5
Цитата Сообщение от Алексей Бергамо Посмотреть сообщение
Вот такая конструкция срабатывает только по первой строке:
Ну так естественно, у тебя просто проверяется наличие в документе узла, соответствующего критерию и выводится результат, в зависимости от результата проверки. Действительно, достаточно, чтобы узел встречался один раз. Если нужно пройтись по каждому узлу, то и используй for-each. Но подсказать более конкретно я не могу, поскольку привык все-таки работать с примерами документов, а не их описаниями своими словами.
1
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 4
26.08.2019, 07:52  [ТС] 6
Diadiavova, ФридрихФ, спасибо! Прикреплю xml файлик. Там 3 строки с товаром, из которых нужно в довесок к адресу выдрать и товар во вхождении которого есть обсадн.
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
27.08.2019, 07:37 7
Цитата Сообщение от Алексей Бергамо Посмотреть сообщение
Там 3 строки с товаром, из которых нужно в довесок к адресу выдрать и товар во вхождении которого есть обсадн.
Ты опять даешь какое-то странное описание документа своими словами. Допустим, что за строки с товаром я разобрался, хотя надо было написать, что это элементы СведТов, а вот что значит "в довесок к адресу выдрать и товар" мне не очень понятно. Сопоставив с тем, что ты делал выше я так понимаю адрес - это то, что в блоке ГрПолуч. Как его увязывать с товаром - непонятно. Короче говоря, сделал самый базовый пример, из которого уже делай что тебе надо
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
 
  <xsl:template match="/">
    <results>
      <xsl:for-each select="//СведТов">
        <product line-number="{@НомСтр}" name="{@НаимТов}" isAccepted="{contains(@НаимТов, 'обсадн')}"/>
      </xsl:for-each>
    </results>
    
  </xsl:template>  
  
</xsl:stylesheet>
Результат получился такой
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<results>
  <product line-number="1" name="Труба электросварная БТС-245Х10-Е с муфтами" isAccepted="false" />
  <product line-number="2" name="Труба обсадная электросварная БТС-245Х10-Е с муфтами" isAccepted="true" />
  <product line-number="3" name="Труба обсадная электросварная БТС-245Х10-Е с муфтами" isAccepted="true" />
</results>
1
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 4
27.08.2019, 09:15  [ТС] 8
Вот такая конструкция работает! Всем спасибо!

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:ext="urn:ext">
  <xsl:output indent="yes" />
  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test= "(Файл/Документ/ТаблСчФакт/СведТов[contains(@НаимТов,'обсадн')])and(Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф[contains(@АдрТекст, 'Юность')]) or (Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф[contains(@АдрТекст, 'Тюмень')]) or (Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф[contains(@АдрТекст, 'СИП')]) or (Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф[contains(@АдрТекст, 'САЛЫМ')]) or (Файл/Документ/СвСчФакт/ГрузПолуч/Адрес/АдрИнф[contains(@АдрТекст, 'АвтоДом')])">
         <XsltFilterResult>
                    <IsAccepted>true</IsAccepted>
                </XsltFilterResult>
            </xsl:when>
               <xsl:otherwise>
                <XsltFilterResult>
                    <IsAccepted>false</IsAccepted>
                </XsltFilterResult>
         
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
0
27.08.2019, 09:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2019, 09:15
Помогаю со студенческими работами здесь

Microsoft Access. Как осуществить выборку по нескольким параметрам ?
Я понимаю, что вопрос глупый, но почему то у меня не получается.. Ситуация такая. Работаю в...

Сортировка по нескольким критериям
есть данные которые находятся в public List&lt;ОбИзделии&gt; Данные { get; set; } public class...

Find по нескольким критериям
Как сделать поиск методом Find объекта RecordSet не по одному, по по нескольким полям?

Отбор по нескольким критериям
в общем то есть бд связанная с машинами нужно сделать так что бы 1 мы выбирали периуд даты...

Выборка из бд по нескольким критериям
Здравствуйте. У меня есть две таблицы: Sfera и Users. Есть простой поиск пользователей в таблице...

Поиск по нескольким критериям
вставляю два текстовых окна в одном фамилии, в другом имена как сделать поиск сразу по двум этим...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru