Вложенные условные циклы (один ко многим) - PullRequest
0 голосов
/ 10 мая 2019

Вход содержит два xml, InputMessagePart_0 имеет несколько идентификаторов местоположения, а InputMessagePart_1 имеет несколько элементов ItemMaster, тогда мне нужно создать выход, где для каждого идентификатора местоположения мне нужно иметь мастер элементов.

Я написал Xslt, где он не зацикливается на уровне InputMessagePart_0 (Запись) и принимает только первый идентификатор местоположения,

XSlT1.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>

1 Ответ

1 голос
/ 10 мая 2019

Вам нужно иметь 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 делает то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...