Во входных данных есть два xml, InputMessagePart_0 имеют несколько идентификаторов местоположения, а InputMessagePart_1 имеют несколько ItemMaster, тогда мне нужно создать выход, где для каждого идентификатора местоположения мне нужно иметь мастер элементов.
Я написал Xslt, где он не зацикливается на уровне InputMessagePart_0 (Record) и принимает только первый идентификатор местоположения,
XSIT1.0 :
<?xml version = "1.0" encoding = "UTF-16"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:msxsl = "urn:schemas-microsoft-com:xslt" xmlns:var = "http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes = "msxsl var s0 s2 s1" version = "1.0" xmlns:s0 = "http://Test.ItemMaster" xmlns:s2 = "http://schemas.microsoft.com/BizTalk/2003/aggschema" xmlns:s1 = "http://Test.Lookup" xmlns:ns0 = "http://Test.Out">
<xsl:output omit-xml-declaration = "yes" method = "xml" version = "1.0" />
<xsl:template match = "/">
<xsl:apply-templates select = "/s2:Root" />
</xsl:template>
<xsl:template match = "/s2:Root">
<ns0:Root>
<xsl:for-each select = "InputMessagePart_1/s0:Root/ItemMaster">
<xsl:variable name = "var:v1" select = "../../../InputMessagePart_0/s1:Root/Record/LocationId" />
<xsl:variable name = "var:v2" select = "ItemId" />
<xsl:variable name = "var:v3" select = "ItemName" />
<xsl:variable name = "var:v4" select = "Quantity" />
<Detail>
<LocationId>
<xsl:value-of select = "$var:v1" />
</LocationId>
<ItemId>
<xsl:value-of select = "$var:v2" />
</ItemId>
<ItemName>
<xsl:value-of select = "$var:v3" />
</ItemName>
<Qty>
<xsl:value-of select = "$var:v4" />
</Qty>
</Detail>
</xsl:for-each>
</ns0:Root>
</xsl:template>
</xsl:stylesheet>
Входной XML:
<ns0:Root xmlns:ns0 = "http://schemas.microsoft.com/BizTalk/2003/aggschema">
<InputMessagePart_0>
<ns0:Root xmlns:ns0 = "http://Test.Lookup">
<Record>
<LocationId>12</LocationId>
</Record>
<Record>
<LocationId>13</LocationId>
</Record>
<Record>
<LocationId>14</LocationId>
</Record>
</ns0:Root>
</InputMessagePart_0>
<InputMessagePart_1>
<ns0:Root xmlns:ns0 = "http://Test.ItemMaster">
<ItemMaster>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Quantity>1</Quantity>
</ItemMaster>
<ItemMaster>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Quantity>1</Quantity>
</ItemMaster>
<ItemMaster>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Quantity>1</Quantity>
</ItemMaster>
</ns0:Root>
</InputMessagePart_1>
</ns0:Root>
Текущий выход:
<ns0:Root xmlns:ns0 = "http://Test.Out">
<Detail>
<LocationId>12</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>12</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>12</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
</ns0:Root>
Желаемый результат:
<ns0:Root xmlns:ns0 = "http://Test.Out">
<Detail>
<LocationId>12</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>12</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>12</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>13</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>13</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>13</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>14</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>14</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>14</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
</ns0:Root>
Desired OutPut :
<ns0:Root xmlns:ns0 = "http://Test.Out">
<Detail>
<LocationId>12</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>12</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>12</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>13</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>13</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>13</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>14</LocationId>
<ItemId>123</ItemId>
<ItemName>Knife</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>14</LocationId>
<ItemId>1234</ItemId>
<ItemName>Knife1</ItemName>
<Qty>1</Qty>
</Detail>
<Detail>
<LocationId>14</LocationId>
<ItemId>1235</ItemId>
<ItemName>Knife3</ItemName>
<Qty>1</Qty>
</Detail>
</ns0:Root>





Вам нужно иметь xsl:for-each (или xsl:apply-templates), чтобы получить Record элементы с локациями. (И этот xsl:for-each будет содержать текущий xsl:for-each на ItemMaster)
Попробуйте этот XSLT
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:msxsl = "urn:schemas-microsoft-com:xslt" xmlns:var = "http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes = "msxsl var s0 s2 s1" version = "1.0" xmlns:s0 = "http://Test.ItemMaster" xmlns:s2 = "http://schemas.microsoft.com/BizTalk/2003/aggschema" xmlns:s1 = "http://Test.Lookup" xmlns:ns0 = "http://Test.Out">
<xsl:output omit-xml-declaration = "yes" method = "xml" indent = "yes" version = "1.0" />
<xsl:template match = "/s2:Root">
<ns0:Root>
<xsl:for-each select = "InputMessagePart_0/s1:Root/Record">
<xsl:variable name = "var:v1" select = "LocationId" />
<xsl:for-each select = "../../../InputMessagePart_1/s0:Root/ItemMaster">
<Detail>
<LocationId>
<xsl:value-of select = "$var:v1" />
</LocationId>
<ItemId>
<xsl:value-of select = "ItemId" />
</ItemId>
<ItemName>
<xsl:value-of select = "ItemName" />
</ItemName>
<Qty>
<xsl:value-of select = "Quantity" />
</Qty>
</Detail>
</xsl:for-each>
</xsl:for-each>
</ns0:Root>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, что сопоставление с шаблоном / здесь на самом деле не нужно, так как встроенный шаблон XSLT делает то же самое.
Здорово ! Спасибо, что указали на это! Это работает :) Большое спасибо, Тим!