#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>
Не уверен, какое отношение к этому имеют переменные. Вы не можете вывести переменную. Вы можете использовать его только для временного хранения. Здесь я использовал переменную только для того, чтобы не повторять один и тот же поиск дважды.