powered by simpleCommunicator - 2.0.31     © 2024 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать данные?
1 сообщений из 1, страница 1 из 1
Как отфильтровать данные?
    #39736118
DymSig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, гуру!

Есть 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.
<table>
    <row>
        <любойтег1>100500</любойтег1>
        <любойтег2>02.06.2017 14:09:44</любойтег2>
        <любойтег..>outsert</любойтег..>
        <любойтег25>Петр</любойтег25>
        <любойтег...>Qwerty</любойтег...>
    </row>
    <row>
        <любойтег1>600606</любойтег1>
        <любойтег2>02.07.2017</любойтег2>
        <любойтег..>insert</любойтег..>
        <любойтег25>Вася</любойтег25>
        <любойтег...>Йцукен</любойтег...>
    </row>
    <row>
        <любойтег1>100600</любойтег1>
        <любойтег2>01.12.2018</любойтег2>
        <любойтег..>downsert</любойтег..>
        <любойтег25>Маша</любойтег25>
        <любойтег...>bla-bla</любойтег...>
    </row>	
    <row>
        <любойтег1>200300</любойтег1>
        <любойтег2>29.02.2017</любойтег2>
        <любойтег..>upsert</любойтег..>
        <любойтег25></любойтег25>
        <любойтег...>bla-bla</любойтег...>
    </row>
</table>



Есть фильтр вида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<filter>
    <любойтег1>70000400</любойтег1>
    <любойтег1>100600</любойтег1>
    <любойтег1>12345678965</любойтег1>
    <любойтег2>13.06.2017</любойтег2>
    <любойтег2>14.06.2017</любойтег2>
    <любойтег..>insert</любойтег..>
    <любойтег25></любойтег25>
</filter>



Нужно с помощью XSLT-преобразования отфильтровать с первого XML только те записи, теги и значения которых не встречаются во втором XML. То есть в предложенном примере должна вернуться одна запись:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<table>
    <row>
        <любойтег1>100500</любойтег1>
        <любойтег2>02.06.2017 14:09:44</любойтег2>
        <любойтег..>outsert</любойтег..>
        <любойтег25>Петр</любойтег25>
        <любойтег...>Qwerty</любойтег...>
    </row>
</table>


Так как, для 2 записи <любойтег..>insert</любойтег..>, для 3 - <любойтег1>100600</любойтег1>, а для 4 - <любойтег25></любойтег25> (пустой).

<любойтег> может быть произвольным, но и в <table /> и в <filter /> любойтег1 = любойтег1 и т.д.

Я применил вот такое преобразование:
Код: 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.
<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 omit-xml-declaration="yes"/>

    <xsl:variable name="filtertext">
        <filter>
            <любойтег1>70000400</любойтег1>
            <любойтег1>100600</любойтег1>
            <любойтег1>12345678965</любойтег1>
            <любойтег2>13.06.2017</любойтег2>
            <любойтег2>14.06.2017</любойтег2>
            <любойтег..>insert</любойтег..>
            <любойтег25></любойтег25>
        </filter>
    </xsl:variable>
    <xsl:variable name="filter" select="msxsl:node-set($filtertext)" />

    <xsl:template match="/">
        <table>
            <xsl:apply-templates select="//row[not(./* = $filter/filter/*)]"></xsl:apply-templates>
        </table>
    </xsl:template>

    <xsl:template match="row">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>



Но оно не работает в случае пустого тега в фильтре.
Прошу помочь.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать данные?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]