Удалить лишние ветки offers в XML используя XSLT по определенным параметрам в url

Есть выгрузка товаров с параметрами. В каталоге имеются "удаленные" товары которые для экспорта/импорта не нужны. исходник в XML


    <?xml version="1.0" encoding="utf-8"?>
    
    <yml_catalog date="2022-11-21T16:19:01+04:00">
      <shop>
        <name>Magazine</name>
        <company>Magazine</company>
        <url>https://Magazine-tv.ru</url>
        <platform>BSM/Yandex/Market</platform>
        <version>2.7.8</version>
        <currencies>
          <currency id="RUR" rate="1" />
        </currencies>
        <categories>
          <category id="189">АНD видеорегистраторы</category>
          <category id="190" parentId="189">4-х канальные</category>
          <category id="193">AHD видеокамеры</category>
          <category id="194" parentId="193">Купольные внутренние камеры</category>
        </categories>
        <enable_auto_discounts>true</enable_auto_discounts>
        <offers>
          <offer id="1130" available="true">
            <url>https://Magazine-tv.ru/catalog/aksessuary_dlya_videonablyudeniya/obektivy_1/1130/</url>
            <price>483</price>
            <currencyId>RUR</currencyId>
            <categoryId>235</categoryId>
            <picture>https://Magazine-tv.ru/upload/iblock/980/v84vhfaf1brwkfgq7o7kazaxxcmqsn9l/e3386623_739c_47d0_a79e_c724b20b9490_71a6e215_e657_11e8_badc_74ea3a85ced2.jpeg</picture>
            <name>L-28</name>
            <description>Объектив с фокусным расстоянием 2.8 мм.</description>
            <param name="Артикул">N-000011709</param>
            <param name="Фокусное расстояние">2.8 мм</param>
            <param name="Тип резьбы">M12</param>
            <param name="Страна производства">Китай</param>
            <param name="Срок гарантии">18 мес</param>
            <weight>0.006</weight>
          </offer>
          <offer id="1131" available="true">
            <url>https://Magazine-tv.ru/catalog/aksessuary_dlya_videonablyudeniya/priemoperedatchiki/1131/</url>
            <price>480</price>
            <currencyId>RUR</currencyId>
            <categoryId>236</categoryId>
            <picture>https://Magazine-tv.ru/upload/iblock/fa1/4ymmfwmsy4823hiqbxgqw25o5a8vyn5d/bf6a5d4d_6488_11e8_98ee_74ea3a85ced2_a7283f85_e641_11e8_badc_74ea3a85ced2.png</picture>
            <name>T-305AH</name>
            <description>Комплект для передачи видеосигнала по витой паре.
    Расстояние передачи видеосигнала до 440 м.
    Встроенная защита от перенапряжения.</description>
            <param name="Артикул">ПЦ000016510</param>
            <param name="Передача видеосигнала">AHD/TVI/CVI/CVBS</param>
            <param name="Передача видеосигнала для AHD">720p AHD до 320 м, 960p ix AHD до 180 м, 4к AHD 150 м</param>
            <param name="Передача видеосигнала для TVI">720p TVI до 250 мix5 Mpix TVI до 180 м, 4к TVI 130 м</param>
            <param name="Передача видеосигнала для CVI">720p CVI до 440 м, 1080p, 4K CVI до 200 м</param>
            <weight>0.06</weight>
          </offer>
          <offer id="1132" available="true">
            <url>https://Magazine-tv.ru/catalog/aksessuary_dlya_videonablyudeniya/obektivy_1/1132/</url>
            <price>470</price>
            <currencyId>RUR</currencyId>
            <categoryId>235</categoryId>
            <picture>https://Magazine-tv.ru/upload/iblock/20c/aqkslnxxd0tv8pexrhhfs1edalkf2607/759615c6_3728_4134_b452_5c67cb82e251_9cd3bd59_e657_11e8_badc_74ea3a85ced2.jpeg</picture>
            <name>L-36</name>
            <description>Объектив с фокусным расстоянием 3.6 мм.</description>
            <param name="Артикул">N-000012222</param>
            <param name="Фокусное расстояние">3.6 мм</param>
            <param name="Тип резьбы">M12</param>
            <param name="Страна производства">Китай</param>
            <param name="Срок гарантии">18 мес</param>
            <weight>0.006</weight>
          </offer>
          <offer id="1134" available="true">
            <url>https://Magazine-tv.ru/catalog/aksessuary_dlya_videonablyudeniya/razemy/1134/</url>
            <price>40</price>
            <currencyId>RUR</currencyId>
            <categoryId>240</categoryId>
            <picture>https://Magazine-tv.ru/upload/iblock/a75/6fiitvnye4tn5zfqwy25cga0fr7jlqh8/57cb449d_5e89_11e8_8d06_74ea3a85ced2_0b320675_e8a0_11e8_8d2a_74ea3a85ced2.jpeg</picture>
            <name>Штекер BNC с пружиной металл</name>
            <description>BNC разъем под винт с пружиной металл предназначен для подключения коаксиального кабеля c волновым сопротивлением 50 и 75 Ом, диаметром до 7 мм, к видеокамерам, видеорегистраторам, мониторам и другим радиоэлектронным устройствам. Такой способ крепления значительно проще и быстрее, чем пайка, его надежность и качество соединения остаются на неизменно высоком уровне. Металлический колпачок с пружиной защищает соединения и предотвращает кабель от перегиба в месте крепления к разъему</description>
            <param name="Артикул">ПЦ000016393_340</param>
            <param name="Срок гарантии">18 мес</param>
            <weight>0.022</weight>
          </offer>
          <offer id="1136" available="true">
            <url>https://Magazine-tv.ru/catalog/aksessuary_dlya_videonablyudeniya/priemoperedatchiki/1136/</url>
            <price>4980</price>
            <currencyId>RUR</currencyId>
            <categoryId>236</categoryId>
            <picture>https://Magazine-tv.ru/upload/iblock/c9f/jz7jou56cvzenmjp7fguzxkh0bwduume/e17eba8c_6ef1_11e8_88a8_74ea3a85ced2_80982677_e658_11e8_badc_74ea3a85ced2.jpeg</picture>
            <name>T-315T</name>
            <description>Одноканальный передатчик видео сигнала, предназначен для передачи сигнала совместно с пассивным приемником T-305AH</description>
            <param name="Артикул">ПЦ000016645</param>
            <param name="Передача видеосигнала для AHD">AHD 720p до 500м, 1080p до 360 м, 5Mp до 250м (с пассивным приемником T-305AH), AHD 720p до 700 м, 1080p до 470 м (с активным приемником)</param>
            <param name="Передача видеосигнала для TVI">TVI 720p/1080p до 320 м (с пассивным приемником T-305AH), TVI 720p/1080p до 400 м (с активным приемником)</param>
            <weight>0.05</weight>
          </offer>
          <offer id="1138" available="true">
            <url>https://Magazine-tv.ru/catalog/oborudovanie_snyatoe_s_proizvodstva/snyato_s_proizvodstva_5/1138/</url>
            <price>13773</price>
            <currencyId>RUR</currencyId>
            <categoryId>327</categoryId>
            <picture>https://Magazine-tv.ru/upload/iblock/bd7/6ead2u8tgz3ddv7lqobms33fzapozq4x/63b1721e_0f11_11e7_8f4a_d850e60dd564_1f9994c7_a9cb_11e8_bd2f_74ea3a85ced2.jpeg</picture>
            <name>R-41F</name>
            <description>Гибридный 4-х канальный видеорегистратор:</description>
            <param name="Артикул">04-41-420-4201-71</param>
            <param name="Процессор">Hi3521A</param>
            <param name="Видеокодек сжатия">H.264 Hight Profile</param>
            <param name="Видеовход">BNC x 4 (композитный 1.0 Vp-p 75 Ом)</param>     
            <weight>1.64</weight>
          </offer>   
        </offers>
      </shop>
    </yml_catalog>

Пробовал по нескольким ответам здесь собрать подобное но либо удаляю только url'ы, либо выделяю только сам url, как перейти на сам оффер из параметра так и не нашел. Удалить нужно офферы содержащие в url 'oborudovanie_snyatoe_s_proizvodstva'. Пробовал так:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
<!--<xsl:for-each select="-->
    <xsl:template match="offer/url[contains(text(),'snyato')]"/>
    
</xsl:stylesheet>

На выходе надо получить тот же XML, но без лишних офферов. Помогите, пожалуйста. P.S> версия xsl думаю тут роли не играет.


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Пожалуйста, попробуйте следующий XSLT.

Для удаления используется правильное выражение XPath и его предикат.

XSLT 1.0

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="no"
                encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!--Identity transform-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="offer[contains(url,'oborudovanie_snyatoe_s_proizvodstva')]"/>
</xsl:stylesheet>
→ Ссылка