Как подстановочный знак или шаблон строки сопоставить с XSLTv1.0

Мои данные XML содержат следующее:

    <Cookies>
    </Cookie>
    <Cookie name = "PD_STATEFUL_2707f5b6-48e3-11e8-bb87-000c2953888d">
    <Value>%2Fportal</Value>
    <Path>/</Path><Domain></Domain><Expires></Expires><Secure>0</Secure> 
    <HTTPOnly>0</HTTPOnly>
    </Cookie>
    <Cookie name = "PD_STATEFUL_2808f5b6-48e3-11e8-bb87-000c2953180d">
    <Value>%2Fwasapp</Value>
    <Path>/</Path><Domain></Domain><Expires></Expires><Secure>0</Secure> 
    <HTTPOnly>0</HTTPOnly>
    </Cookie>
    </Cookies>

Используя XLSTv1.0, как мне изменить следующий код, чтобы установить атрибуты для всех файлов cookie, начиная с PD_STATEFUL_ *, а не кодировать каждое конкретное имя файла cookie?

    <xsl:template match = "//HTTPResponse/Cookies">
        <xsl:if test = "Cookie/@name='PD_STATEFUL_2707f5b6-48e3-11e8-bb87-000c2953180d'">
            <Cookie action = "update" name = "PD_STATEFUL_2707f5b6-48e3-11e8-bb87-000c2953180d">
                <Secure>1</Secure>
                <HTTPOnly>1</HTTPOnly>
            </Cookie>
        </xsl:if>
        <xsl:if test = "Cookie/@name='PD_STATEFUL_2808f5b6-48e3-11e8-bb87-000c2953180d'">
            <Cookie action = "update" name = "PD_STATEFUL_2808f5b6-48e3-11e8-bb87-000c2953180d">
                <Secure>1</Secure>
                <HTTPOnly>1</HTTPOnly>
            </Cookie>
        </xsl:if>
    </xsl:template>

каков ваш ожидаемый результат?

Allan 02.05.2018 03:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
227
1

Ответы 1

Поскольку я не был уверен в ожидаемом результате, я предоставил 2 таблицы стилей:

1) Сохраните ту же структуру узла Cookie и просто измените значения элементов Secure и HTTPOnly на 1 и добавьте атрибут action = "update"

2) Удалите все остальные подузлы узла Cookie, добавив атрибут action = "update" и изменив значение Secure и HTTPOnly на 1.

ВХОД:

::::::::::::::
cookies.xml
::::::::::::::
<?xml version = "1.0" encoding = "utf-8"?>
<Cookies>
  <Cookie name = "PD_STATEFUL_2707f5b6-48e3-11e8-bb87-000c2953888d">
    <Value>%2Fportal</Value>
    <Path>/</Path>
    <Domain/>
    <Expires/>
    <Secure>0</Secure>
    <HTTPOnly>0</HTTPOnly>
  </Cookie>
  <Cookie name = "PD_STATEFUL_2808f5b6-48e3-11e8-bb87-000c2953180d">
    <Value>%2Fwasapp</Value>
    <Path>/</Path>
    <Domain/>
    <Expires/>
    <Secure>0</Secure>
    <HTTPOnly>0</HTTPOnly>
  </Cookie>
</Cookies>

ДЕЛО 1

СТИЛЬ:

::::::::::::::
cookies.xsl
::::::::::::::
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

<!-- identity transform -->
<xsl:template match = "@*|node()">
    <xsl:copy>
        <xsl:apply-templates select = "@*|node()"/>
    </xsl:copy>
</xsl:template>
    <xsl:template match = "Cookie[starts-with(@name,'PD_STATEFUL_')]">
        <Cookie action = "update" name = "{./@name}">
                <xsl:apply-templates select = "@*|node()"/>
        </Cookie>
    </xsl:template>
    <xsl:template match = "Cookie[starts-with(@name,'PD_STATEFUL_')]/Secure/text()">1</xsl:template>
    <xsl:template match = "Cookie[starts-with(@name,'PD_STATEFUL_')]/HTTPOnly/text()">1</xsl:template>
</xsl:stylesheet>

ПОЯСНЕНИЯ:

Скопируйте каждый узел / атрибут, затем при достижении узлов, которые соблюдают условие Cookie[starts-with(@name,'PD_STATEFUL_')], вы добавляете атрибут action = "update", используйте тот же атрибут name = "{./@name}", а затем копируйте все, что находится под этим элементом, при достижении Cookie[starts-with(@name,'PD_STATEFUL_')]/Secure/text() и Cookie[starts-with(@name,'PD_STATEFUL_')]/HTTPOnly/text() шаблон будет запущен, и значение будет установлено на 1. Это изменение не коснется других файлов cookie, не поддерживающих starts-with(@name,'PD_STATEFUL_').

ВЫХОД:

$xsltproc cookies.xsl cookies.xml | xmllint --format -                                                                         
<?xml version = "1.0"?>
<Cookies>
  <Cookie action = "update" name = "PD_STATEFUL_2707f5b6-48e3-11e8-bb87-000c2953888d">
    <Value>%2Fportal</Value>
    <Path>/</Path>
    <Domain/>
    <Expires/>
    <Secure>1</Secure>
    <HTTPOnly>1</HTTPOnly>
  </Cookie>
  <Cookie action = "update" name = "PD_STATEFUL_2808f5b6-48e3-11e8-bb87-000c2953180d">
    <Value>%2Fwasapp</Value>
    <Path>/</Path>
    <Domain/>
    <Expires/>
    <Secure>1</Secure>
    <HTTPOnly>1</HTTPOnly>
  </Cookie>
</Cookies>

CASE2:

СТИЛЬ:

::::::::::::::
cookies2.xsl
::::::::::::::
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

<!-- identity transform -->
<xsl:template match = "@*|node()">
    <xsl:copy>
        <xsl:apply-templates select = "@*|node()"/>
    </xsl:copy>
</xsl:template>
    <xsl:template match = "Cookie[starts-with(@name,'PD_STATEFUL_')]">
        <Cookie action = "update" name = "{./@name}">
                <Secure>1</Secure>
                <HTTPOnly>1</HTTPOnly>
        </Cookie>
    </xsl:template>
</xsl:stylesheet>

ОБЪЯСНЕНИЕ:

Здесь при достижении узлов, уважающих Cookie[starts-with(@name,'PD_STATEFUL_') мы перезаписываем содержимое узла на

        <Cookie action = "update" name = "{./@name}">
                <Secure>1</Secure>
                <HTTPOnly>1</HTTPOnly>
        </Cookie>

Поэтому другие подузлы будут потеряны.

ВЫХОД:

$ xsltproc cookies2.xsl cookies.xml | xmllint --format -
<?xml version = "1.0"?>
<Cookies>
  <Cookie action = "update" name = "PD_STATEFUL_2707f5b6-48e3-11e8-bb87-000c2953888d">
    <Secure>1</Secure>
    <HTTPOnly>1</HTTPOnly>
  </Cookie>
  <Cookie action = "update" name = "PD_STATEFUL_2808f5b6-48e3-11e8-bb87-000c2953180d">
    <Secure>1</Secure>
    <HTTPOnly>1</HTTPOnly>
  </Cookie>
</Cookies>

Другие вопросы по теме