XSL Выбор правильной подстроки на основе условий

Я перехожу от простой подстроки из 2 с разделителем '', которая в настоящее время использует подстроку до и подстроку после, но теперь мне нужно изменить ее, чтобы вместить несколько подстрок, количество которых различается. Я попробовал несколько разных методов, которые нашел на этой стороне, но либо я слишком новичок, чтобы даже понять это, либо не думаю, что это сработает.

<xsl:template name = "print_cmp_code_by_color_and_subtype"><xsl:param name = "code"/><xsl:param name = "color_code"/><xsl:param name = "subtype_code"/>
        <xsl:choose>
            <xsl:when test = "contains($code,' ')">
                <xsl:call-template name = "print_cmp_code_by_color_and_subtype">
                    <xsl:with-param name = "code" select = "normalize-space(substring-before($code,' '))"/>
                    <xsl:with-param name = "color_code" select = "$color_code"/>
                    <xsl:with-param name = "subtype_code" select = "$subtype_code"/>
                </xsl:call-template>
                <xsl:call-template name = "print_cmp_code_by_color_and_subtype">
                    <xsl:with-param name = "code" select = "normalize-space(substring-after($code,' '))"/>
                    <xsl:with-param name = "color_code" select = "$color_code"/>
                    <xsl:with-param name = "subtype_code" select = "$subtype_code"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:if test = "contains($code,'=')">
                    <xsl:if test = "normalize-space(substring-before($code,'='))=$color_code">
                        <xsl:value-of select = "normalize-space(substring-after($code,'='))"/>
                    </xsl:if>
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
<itemNo>
                    <xsl:choose>
                        <xsl:when test = "cmp_code">
                            <xsl:choose>
                                <xsl:when test = "contains(cmp_code,'=')">
                                    <xsl:call-template name = "print_cmp_code_by_color">
                                        <xsl:with-param name = "code" select = "cmp_code"/>
                                        <xsl:with-param name = "color_code" select = "colors/color[col_type='external']/col_code"/>
                                        <xsl:with-param name = "subtype_code" select = "cmp_options/coption/opt_values/opt_value[(ov_keywords_list/keyword='SAGE') and (ov_active='true')]/ov_description"/>
                                    </xsl:call-template>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select = "cmp_code"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select = "cmp_series_code"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </itemNo>

Проблема заключается в вводе параметра кода. Я перешел от «Dog=9500 Cat=9502» к «Dog_BX=9500 Dog_CX=9502 Cat_BX=9856-BX Cat_CX=9856-CX Elephant=9787 Cow=8734».

Иногда у него есть подтип, иногда нет. Иногда требуется цветовой код, иногда нет.

Имя животного — это код подтипа, а BX или CX — это код цвета.

Значение, которое я пытаюсь передать, — это соответствующая подстрока, где, если строка содержит «=", то используется подстрока с соответствующим кодом цвета в XML. Если подстроки содержат «_», используется подстрока, соответствующая коду_подтипа XML. Если он имеет "=" и "_", то используется подстрока, соответствующая XML-коду color_code и subtype_code.

Я так потерян и нуждаюсь в помощи.

Редактировать 1: Если код цвета в XML был «CX», а код подтипа в XML был «Cat», то ожидаемый результат будет «9856-CX». желаемый результат в конечном итоге является json

"itemNo": "9856-CX",
"qty": "1",
"jobNo": "230108",
"batchNo": "-01",
"materials": [
{
"itemNo": "6285-BX",
"qty": "6.677",
"UOM": "FEET",
"location": "230108"
}

приведенный выше пример json неполный, однако мое основное внимание уделяется анализу правильного родительского элементаNo для отправки в SAGE300.

XSLT 1.0

<?xml version = "1.0" encoding = "UTF-8"?>
<jobs xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "xfatcom2.xsd" generated = "2024-04-04T16:14:13" version = "2.0">
<job>
<PKEY>1</PKEY>
<ID>19444</ID>
<job_id>162</job_id>
<job_year>2024</job_year>
<job_name>9999999999</job_name>
<job_components>
<component>
<PKEY>26</PKEY>
<FKEY>1</FKEY>
<cmp_code>Dog_BX=9500 Dog_CX=9502 Cat_BX=9856-BX Cat_CX=9856-CX Elephant=9787 Cow=8734</cmp_code>
<colors>
<color>
<PKEY>38</PKEY>
<FKEY>36</FKEY>
<col_type>external</col_type>
<col_code>BX</col_code>
</color>
</colors>
<cmp_options>
<coption>
<opt_values>
<opt_value>
<ov_description>Cat</ov_description>
<ov_keywords_list>
<keyword>SAGE</keyword>
</ov_keywords_list>
<ov_active>true</ov_active>
</opt_value>
</opt_values>
</coption>
</cmp_options>
</component>
<component>
<PKEY>26</PKEY>
<FKEY>1</FKEY>
<cmp_code>Dog_BX=9500 Dog_CX=9502 Cat_BX=9856-BX Cat_CX=9856-CX Elephant=9787 Cow=8734</cmp_code>
<colors>
<color>
<PKEY>38</PKEY>
<FKEY>36</FKEY>
<col_type>external</col_type>
<col_code>CX</col_code>
</color>
</colors>
<cmp_options>
<coption>
<opt_values>
<opt_value>
<ov_description>Dog</ov_description>
<ov_keywords_list>
<keyword>SAGE</keyword>
</ov_keywords_list>
<ov_active>true</ov_active>
</opt_value>
</opt_values>
</coption>
</cmp_options>
</component>
<component>
<PKEY>26</PKEY>
<FKEY>1</FKEY>
<cmp_code>Dog_BX=9500 Dog_CX=9502 Cat_BX=9856-BX Cat_CX=9856-CX Elephant=9787 Cow=8734</cmp_code>
<colors>
<color>
<PKEY>38</PKEY>
<FKEY>36</FKEY>
<col_type>external</col_type>
<col_code>CX</col_code>
</color>
</colors>
<cmp_options>
<coption>
<opt_values>
<opt_value>
<ov_description>Elephant</ov_description>
<ov_keywords_list>
<keyword>SAGE</keyword>
</ov_keywords_list>
<ov_active>true</ov_active>
</opt_value>
</opt_values>
</coption>
</cmp_options>
</component>
</job_components>
</job>
</jobs>

Ваш вопрос не ясен. Если входными данными является строка "Dog_BX=9500 Dog_CX=9502 Cat_BX=9856-BX Cat_CX=9856-CX Elephant=9787 Cow=8734", то каков ожидаемый результат (и почему)? --- П.С. Во всех вопросах, касающихся XSLT, указывайте, какую версию XSLT поддерживает ваш процессор — см.: stackoverflow.com/a/25245033/3016153

michael.hor257k 15.04.2024 20:22

Откуда берутся все эти ценности? Покажите, пожалуйста, пример входного XML — см.: минимальный воспроизводимый пример.

michael.hor257k 15.04.2024 20:50

Ваш XML выдает ошибку синтаксического анализа в строке 31: the element type "opt_value" must be terminated by the matching end-tag "</opt_value>".

y.arazim 15.04.2024 21:28
Учебная записка [Medium] Leetcode#22 Generate Parentheses
Учебная записка [Medium] Leetcode#22 Generate Parentheses
На этот раз мы собираемся решить еще одну классическую проблему, связанную с парными скобками, так называемую генерацию скобок.
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш вопрос все еще не ясен, но, возможно, вы могли бы использовать его в качестве отправной точки:

XML

<input>
    <item subtype_code = "Cat" color_code = "CX"/>
    <item subtype_code = "Elephant"/>
</input>

XSLT 1.0

<xsl:stylesheet version = "1.0" 
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>

<xsl:param name = "code">Dog_BX=9500 Dog_CX=9502 Cat_BX=9856-BX Cat_CX=9856-CX Elephant=9787 Cow=8734</xsl:param>

<xsl:template match = "/input">
    <output>
        <xsl:for-each select = "item">
            <item subtype_code = "{@subtype_code}" color_code = "{@color_code}">
                <xsl:variable name = "key">
                    <xsl:value-of select = "@subtype_code"/>
                    <xsl:if test = "@color_code">
                        <xsl:value-of select = "concat('_', @color_code)"/>
                    </xsl:if>
                    <xsl:text>=</xsl:text>
                </xsl:variable>
                <xsl:value-of select = "substring-before(substring-after(concat($code, ' '), $key), ' ')"/>
            </item>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version = "1.0" encoding = "UTF-8"?>
<output>
   <item subtype_code = "Cat" color_code = "CX">9856-CX</item>
   <item subtype_code = "Elephant" color_code = "">9787</item>
</output>

Все это часть более крупного анализа данных, который не удовлетворяет требованиям.

StrugglingToCode 16.04.2024 19:21

Я считаю, что это отвечает на вопрос, как получить правильное значение из строки code, учитывая два компонента key. Если у вас есть другие вопросы, предлагаю опубликовать их отдельно.

michael.hor257k 16.04.2024 19:38
Ответ принят как подходящий
<xsl:template name = "split">
        <xsl:param name = "code"/>
        <xsl:param name = "color_code" select = "concat(cmp_options/coption/opt_values/opt_value[(ov_keywords_list/keyword='SAGE') and (ov_active='true')]/opt_code, colors/color[col_type='external']/col_code)"/>
            <xsl:choose>
                <xsl:when test = "contains($code, $color_code)">
                    <xsl:call-template name = "split">
                        <xsl:with-param name = "code" select = "substring-after($code, $color_code)"/>
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select = "substring-before(substring-after(concat($code,' '),'='),' ')"/>
            </xsl:otherwise>
        </xsl:choose>
</xsl:template>

В итоге я потратил около двух дней на поиск подходящего метода и нашел на GitHub «разделение строки и цикл» Хенрика Хэнсона. Я до сих пор понятия не имею, что делаю, но мне удалось пробовать и ошибаться в различных комбинациях разных вещей.

Другие вопросы по теме