Отображение данных плоского файла на узлы-братья
У меня есть плоский файл, в котором каждая запись является клиентом, и в ней есть адрес доставки и счета. Выходная схема имеет запись клиента с адресным дочерним узлом. Я не знаю, как отобразить 2 адреса из входящей записи в дочерние узлы записи клиента.
У меня есть входной файл, который определяется как:
<customer>
<customernum/>
<shipaddrcity/>
<shipaddrstate/>
<shipaddrzip/>
<billaddrcity/>
<billaddrstate/>
<billaddrzip/>
</customer>
Результат должен выглядеть примерно так:
<customer>
<customernum/>
<addr>
<type/>
<city/>
<state/>
<zip/>
</addr>
<addr>
<type/>
<city/>
<state/>
<zip/>
</addr>
</customer>
Я совсем новичок в biztalk и не смог найти достойных примеров того, как выполнить это с помощью Biztalk Mapper. Я также готов послушать, как это сделать с помощью xslt.
1 ответ
Возможно, вы хотите что-то конкретное для BizTalk, и я ничего не знаю о BizTalk, но это может быть полезно для вас в любом случае.
Учитывая входной документ...
<customers>
<customer>
<customernum>1</customernum>
<shipaddrcity>Cairns</shipaddrcity>
<shipaddrstate>QLD</shipaddrstate>
<shipaddrzip>b</shipaddrzip>
<billaddrcity>Sydney</billaddrcity>
<billaddrstate>NSW</billaddrstate>
<billaddrzip>c</billaddrzip>
</customer>
<customer>
<customernum>2</customernum>
<shipaddrcity>d</shipaddrcity>
<shipaddrstate>WA</shipaddrstate>
<shipaddrzip>e</shipaddrzip>
<billaddrcity>Melbourne</billaddrcity>
<billaddrstate>Vic</billaddrstate>
<billaddrzip>f</billaddrzip>
</customer>
</customers>
... эта таблица стилей XSLT 1.0...
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="customer">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(
self::shipaddrstate|
self::shipaddrzip |
self::billaddrstate|
self::billaddrzip )]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="shipaddrcity">
<addr>
<type>ship</type>
<city><xsl:value-of select="." /></city>
<xsl:apply-templates select="../(shipaddrstate|shipaddrzip)" />
</addr>
</xsl:template>
<xsl:template match="billaddrcity">
<addr>
<type>bill</type>
<city><xsl:value-of select="." /></city>
<xsl:apply-templates select="../(billaddrstate|billaddrzip)" />
</addr>
</xsl:template>
<xsl:template match="shipaddrstate|billaddrstate">
<state><xsl:value-of select="." /></state>
</xsl:template>
<xsl:template match="shipaddrzip|billaddrzip">
<zip><xsl:value-of select="." /></zip>
</xsl:template>
</xsl:transform>
... применительно к входному документу, даст...
<customers>
<customer>
<customernum>1</customernum>
<addr>
<type>ship</type>
<city>Cairns</city>
<state>QLD</state>
<zip>b</zip>
</addr>
<addr>
<type>bill</type>
<city>Sydney</city>
<state>NSW</state>
<zip>c</zip>
</addr>
</customer>
<customer>
<customernum>2</customernum>
<addr>
<type>ship</type>
<city>d</city>
<state>WA</state>
<zip>e</zip>
</addr>
<addr>
<type>bill</type>
<city>Melbourne</city>
<state>Vic</state>
<zip>f</zip>
</addr>
</customer>
</customers>