Я перехожу от простой подстроки из 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>
Откуда берутся все эти ценности? Покажите, пожалуйста, пример входного XML — см.: минимальный воспроизводимый пример.
Ваш XML выдает ошибку синтаксического анализа в строке 31: the element type "opt_value" must be terminated by the matching end-tag "</opt_value>".
Ваш вопрос все еще не ясен, но, возможно, вы могли бы использовать его в качестве отправной точки:
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>
Все это часть более крупного анализа данных, который не удовлетворяет требованиям.
Я считаю, что это отвечает на вопрос, как получить правильное значение из строки code
, учитывая два компонента key
. Если у вас есть другие вопросы, предлагаю опубликовать их отдельно.
<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 «разделение строки и цикл» Хенрика Хэнсона. Я до сих пор понятия не имею, что делаю, но мне удалось пробовать и ошибаться в различных комбинациях разных вещей.
Ваш вопрос не ясен. Если входными данными является строка
"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