Как вы подстановочный знак или шаблон строки соответствуют XSLTv1.0 - PullRequest
0 голосов
/ 02 мая 2018

Мои данные 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>

1 Ответ

0 голосов
/ 02 мая 2018

Поскольку я не был уверен в ожидаемом результате, я предоставил 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

STYLESHEET:

::::::::::::::
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>

Вариант 2:

STYLESHEET:

::::::::::::::
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>
...