Найти и заменить слова в тегах в файле XML

Рейтинг: 1Ответов: 1Опубликовано: 07.02.2023

Всем привет.

Помогите создать xsl можно 3 версии, мне нужно в xml файле находить и менять значение в строке, например Жесткий картон, 350 гр. нужно изменить Картон 350 гр или KREATO_350_B3 на Креато 350 гр.

Весь xml не стал выкладывать, но остальные параметры в нем должны остаться

Вот сам xml

<?xml version="1.0" encoding="UTF-8"?>
<zakazy>
    <params KodProverki=""
            obrabotki1Name="Жесткий картон, 350 гр."
            obrabotki1="KREATO_350_B3"
            
          />  
</zakazy>

Заранее спасибо за помощь

Ответы

▲ 0Принят

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

Оно использует так называемый «Identity Transform» шаблон.

Версия №2 и №3 работают с последовательностями (sequences).

Алгоритм поиска и замены работает на основе местоположения в последовательностях.

Исходный XML

<?xml version="1.0" encoding="UTF-8"?>
<zakazy>
    <params KodProverki="" obrabotki1Name="Жесткий картон, 350 гр." obrabotki1="KREATO_350_B3"/>
</zakazy>

XSLT 3.0, версия №1

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

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:template match="@*[.='Жесткий картон, 350 гр.']">
        <xsl:attribute name="{local-name()}" select="'Картон 350 гр.'"/>
    </xsl:template>

    <xsl:template match="@*[.='KREATO_350_B3']">
        <xsl:attribute name="{local-name()}" select="'Креато 350 гр.'"/>
    </xsl:template>
</xsl:stylesheet>

XSLT 3.0, версия №2

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

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:template match="@*[.=('Жесткий картон, 350 гр.','KREATO_350_B3')]">
        <xsl:variable name="pos" select="index-of(('Жесткий картон, 350 гр.', 'KREATO_350_B3'), .)" />
        <xsl:attribute name="{local-name()}" select="subsequence(('Картон 350 гр.', 'Креато 350 гр.')
            , $pos, $pos)"/>
    </xsl:template>
</xsl:stylesheet>

XSLT 3.0, версия №3

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

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:variable name="sequence_find" select="'Жесткий картон, 350 гр.', 'KREATO_350_B3'"/>
    <xsl:variable name="sequence_replace" select="'Картон 350 гр.', 'Креато 350 гр.'"/>

    <xsl:template match="@*[.=$sequence_find]">
        <xsl:variable name="pos" select="index-of($sequence_find, .)"/>
        <xsl:attribute name="{local-name()}" select="subsequence($sequence_replace, $pos, $pos)"/>
    </xsl:template>
</xsl:stylesheet>

Результат

<?xml version='1.0' encoding='utf-8' ?>
<zakazy>
  <params KodProverki="" obrabotki1Name="Картон 350 гр." obrabotki1="Креато 350 гр."/>
</zakazy>