Замена в тегах XML, слово или пару слов через XSLT
Здравствуйте помогите в xml сделать замену в атрибуте gotovnost. Нужно искать не всю строчку в атрибуте, а только слово или несколько слов и заменять на нужное. Например: gotovnost="8 декабря 2022, c 10 до 18 часов". Нужно в атрибуте gotovnost вместо слово декабрь поставить цифру месяца (12), вместо часов написать time, ну и тд. а все остальное осталось. Как это дописать в код XSLT 3
XML
<zakazy>
<params KodProverki=""
obrabotki1="Жесткий картон, 350 гр."
obrabotki1="KREATO_350_B3"
gotovnost="8 декабря 2022, c 10 до 18 часов"
/>
</zakazy>
XSL 3.0
<?xml version="1.0"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" expand-text="yes" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:map="http://www.w3.org/2005/xpath-functions/map">
<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="find_and_replace" as="map(xs:string, xs:string)">
<xsl:map>
<xsl:map-entry key="'Жесткий картон, 350 гр.'" select="'Картон 350 гр.'"/>
<xsl:map-entry key="'KREATO_350_B3'" select="'Креато 350 гр.'"/>
<!--Добавьте столько пар ключ/значение, сколько необходимо-->
</xsl:map>
</xsl:variable>
<xsl:template match="@*[.=map:keys($find_and_replace)]">
<xsl:attribute name="{local-name()}" select="map:get($find_and_replace, .)"/>
</xsl:template>
</xsl:stylesheet>
Желаемый результат XSLT 3.0
<?xml version='1.0'
encoding='utf-8' ?>
<zakazy>
<params KodProverki=""
obrabotki1Name="Картон 350 гр."
obrabotki1="Креато 350 гр."
gotovnost="8.12.2022, c 10 до 18 time"
/>
</zakazy>
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Пожалуйста, попробуйте следующий XSLT.
Оно использует очень полезный для такого сценария xsd:analyze-string оператор.
Разобьем все предложение на 3 группы:
regex-group(1)- для цифр.regex-group(2)- для слов, окруженных пробелами.xsl:non-matching-substringдля всего остального.
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
expand-text="yes" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map">
<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="find_and_replace" as="map(xs:string, xs:string)">
<xsl:map>
<xsl:map-entry key="'Жесткий картон, 350 гр.'"
select="'Картон 350 гр.'"/>
<xsl:map-entry key="'KREATO_350_B3'" select="'Креато 350 гр.'"/>
<!--Добавьте столько пар ключ/значение, сколько необходимо-->
</xsl:map>
</xsl:variable>
<xsl:template match="@*[.=map:keys($find_and_replace)]">
<xsl:attribute name="{local-name()}"
select="map:get($find_and_replace, .)"/>
</xsl:template>
<xsl:template match="@*[ends-with(., 'часов')]">
<xsl:attribute name="{local-name()}">
<xsl:analyze-string select="." regex="(\d{{1,2}})|(\s\w*\s)">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(1)">
<xsl:value-of select="."/>
</xsl:when>
<xsl:when test="regex-group(2)">
<xsl:choose>
<!--добавить все месяцы, следуя тому же шаблону-->
<xsl:when test=". = ' ноября '">
<xsl:text>.11.</xsl:text>
</xsl:when>
<xsl:when test=". = ' декабря '">
<xsl:text>.12.</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="replace(.,'часов','time')"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>