Удаление из строки лишнее, используя xslt 3

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

Всем привет. у меня есть xml который я обрабатываю через xslt 3.0, мне нужно чтобы в теге gotovnost оставалась только дата, остальное все уделено. Помогите мне изменить xsl 3.0, чтобы в теге gotovnost осталось только дата.

xml входящие

<zakazy>
    <params KodProverki=""
            obrabotki1="Жесткий картон, 350 гр."
            obrabotki1="KREATO_350_B3"
            gotovnost="8 декабря 2022, c 10 до 18 часов"
    />  
</zakazy>

xsl 3

<?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="@gotovnost">
            <xsl:attribute name="gotovnost">
                <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:analyze-string>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Желаемый результат

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

Ответы

▲ 1Принят

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

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:variable name="date_only">
                <xsl:analyze-string select="." regex="(\d)|(\s\w+\s)">
                    <xsl:matching-substring>
                        <xsl:choose>
                            <xsl:when test="regex-group(1)">{.}</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:otherwise>
                                </xsl:choose>
                            </xsl:when>
                        </xsl:choose>
                    </xsl:matching-substring>
                    <xsl:non-matching-substring>{replace(.,'часов','time')}</xsl:non-matching-substring>
                </xsl:analyze-string>
            </xsl:variable>
            <xsl:value-of select="substring-before($date_only, ',')"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Результат

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