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