Заполнить переменную в XSLT значением, основанным на условной проверке в другом сегменте

#xml #xslt

Вопрос:

У меня есть xml с повторяющимся сегментом DPART, и мне нужно выбрать значение АДРЕСА из любого сегмента, имеющего PARTN_ROLE как «UU», и использовать этот адрес для получения переменных ИМЕНИ и УЛИЦЫ из другого повторяющегося сегмента DCOAD. поэтому нужно извлечь 2 переменные:-

 <xsl:variable name="Cust_Name"
<xsl:variable name="Cust_Street"
 

.

Выходная переменная должна быть такой:-

 <Cust_Name>Michael</Cust_Name>
<Cust_Street>ABCH</Cust_Street>
 

Часть входного XML:-

 <Z1E1P SEGMENT="1">
    <ORDER>5467899</ORDER>
    <ACCOUNT>X</ACCOUNT>
    <Z1BP_ISAORDER SEGMENT="1">         
       <DPART SEGMENT="1">
        <PARTN_ROLE>JK</PARTN_ROLE>
        <CONTACT>0000000000</CONTACT>
        <ADDRESS>0000027647</ADDRESS>
       </DPART>
       <DPART SEGMENT="1">
        <PARTN_ROLE>UU</PARTN_ROLE>
        <CONTACT>0000000000</CONTACT>
        <ADDRESS>9164412232</ADDRESS>
       </DPART>
       <DCOAD SEGMENT="1">
        <ADDRESS>0000023378</ADDRESS>
        <NAME>John</NAME>
        <STREET>gyhu</STREET>
        <COUNTRY>US</COUNTRY>
       </DCOAD>
       <DCOAD SEGMENT="1">
        <ADDRESS>9164412232</ADDRESS>
        <NAME>Michael</NAME>
        <STREET>ABCH</STREET>
        <COUNTRY>US</COUNTRY>
       </DCOAD>
    </Z1BP_ISAORDER>
</Z1E1P>
 

Это должно быть обработано с помощью XSLT 1.0
Я попробовал ниже XSLT, но не получил результат, часть xslt:-

 <xsl:variable name="Cust_Name">
    <xsl:if test="node()/Z1BP_ISAORDER/DPART[PARTN_ROLE='UU']/ADDRESS = node()/Z1BP_ISAORDER/DCOAD/ADDRESS">
        <xsl:copy-of select="node()/Z1BP_ISAORDER/DCOAD/NAME">
        </xsl:copy-of>
    </xsl:if>
</xsl:variable>

<xsl:variable name="Cust_Street">
    <xsl:if test="node()/Z1BP_ISAORDER/DPART[PARTN_ROLE='UU']/ADDRESS = node()/Z1BP_ISAORDER/DCOAD/ADDRESS">
        <xsl:copy-of select="node()/Z1BP_ISAORDER/DCOAD/STREET">
        </xsl:copy-of>
    </xsl:if>
</xsl:variable>
 

Ответ №1:

Неясно, в каком контексте вы объявляете переменные. Но я полагаю, что это даст вам хорошее начало:

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

  <xsl:variable name="allSegments"  select="/Z1E1P/Z1BP_ISAORDER/*"/>
  
  <xsl:variable name="addressNumber"  select="$allSegments[PARTN_ROLE='UU']/ADDRESS/text()"/>
  <xsl:variable name="segmentToUse"   select="$allSegments[not(PARTN_ROLE='UU') and ADDRESS/text()=$addressNumber]"/>
      
  <xsl:variable name="Cust_Name"      select="$segmentToUse/NAME"/>
  <xsl:variable name="Cust_Street"    select="$segmentToUse/STREET"/>
  
  <xsl:template match="/">
    <xsl:copy-of select="$Cust_Name"/>
    <xsl:copy-of select="$Cust_Street"/>
  </xsl:template>

</xsl:stylesheet>
 

Выведет:

 <NAME>Michael</NAME>
<STREET>ABCH</STREET>
 

Ответ №2:

Если я правильно понял ваш вопрос (что совсем не обязательно), вы хотите найти имя клиента и магазин на основе соответствующего ADDRESS значения. Лучше всего это сделать, определив ключ и используя его. Вот пример:

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:key name="cust-by-addr" match="DCOAD" use="ADDRESS" />

<xsl:template match="Z1E1P">
    <output>
        <xsl:for-each select="Z1BP_ISAORDER/DPART[PARTN_ROLE='UU']">
            <xsl:variable name="addr" select="key('cust-by-addr', ADDRESS)" />
            <Customer>
                <Cust_Name>
                    <xsl:value-of select="$addr/NAME" />
                </Cust_Name>
                <Cust_Street>
                    <xsl:value-of select="$addr/STREET" />
                </Cust_Street>
            </Customer>
        </xsl:for-each>
    </output>   
</xsl:template>

</xsl:stylesheet>
 

Применительно к вашему примеру ввода это вернет:

 <?xml version="1.0" encoding="UTF-8"?>
<output>
  <Customer>
    <Cust_Name>Michael</Cust_Name>
    <Cust_Street>ABCH</Cust_Street>
  </Customer>
</output>
 

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