Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать данные? / 1 сообщений из 1, страница 1 из 1
21.11.2018, 13:56
    #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
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отфильтровать данные? / 1 сообщений из 1, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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