【问题标题】:BizTalk XSLT Mapping For Grouping and Sorting with Multiple Records用于对多条记录进行分组和排序的 BizTalk XSLT 映射
【发布时间】:2019-06-18 13:01:02
【问题描述】:

输入信息:

输入文件在详细信息中具有三个记录,顺序为“成员”、“产品”和“依赖”,在每个记录中都有一个公共字段“标识符”出于某种原因,我们得到每个成员和产品循环到一个细节中,每个依赖都循环到单独的细节中 ..................................................... ....................

    <ns0:Root xmlns:ns0="Test">
  <Detail>
    <Member>
      <Name>Jerry</Name>
      <Address>Miami</Address>
      <PhoneNumber>7008084201</PhoneNumber>
      <Identifier>225692067</Identifier>
    </Member>
    <Product>
      <Name>Phone</Name>
      <Type>Personal</Type>
      <Serial>000000111111</Serial>
      <Identifier>225692067</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Tom</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Tom1</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>8228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Tom2</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>9228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Member>
      <Name>John</Name>
      <Address>Kansas</Address>
      <PhoneNumber>5007684306</PhoneNumber>
      <Identifier>699039521</Identifier>
    </Member>
    <Product>
      <Name>Xbox</Name>
      <Type>Personal</Type>
      <Serial>000000222222</Serial>
      <Identifier>699039521</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Member>
      <Name>Larry</Name>
      <Address>Newjersey</Address>
      <PhoneNumber>6004567307</PhoneNumber>
      <Identifier>230903815</Identifier>
    </Member>
    <Product>
      <Name>Iphone</Name>
      <Type>Personal</Type>
      <Serial>0000003333333</Serial>
      <Identifier>230903815</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>Luis</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7897684302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
  </Detail>
  <Detail>
    <Dependent>
      <DependentName>LuisMead</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7229876302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
  </Detail>
</ns0:Root>

预期输出 XML:

输出文件也类似于输入文件,但顺序是“成员”、“依赖”和“产品”。在这种情况下,公共字段“标识符”也是常见的。这个想法是使详细信息在“成员”、“依赖”和“产品”顺序上循环。 ..................................................... .....................................

    <ns0:Root xmlns:ns0="Test">
  <Detail>
    <Member>
      <Name>Jerry</Name>
      <Address>Miami</Address>
      <PhoneNumber>7008084201</PhoneNumber>
      <Identifier>225692067</Identifier>
    </Member>

    <Dependent>
      <DependentName>Tom</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
    <Dependent>
      <DependentName>Tom1</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>8228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
    <Dependent>
      <DependentName>Tom2</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>9228084302</DependentPhoneNumber>
      <Identifier>225692067</Identifier>
    </Dependent>
    <Product>
      <Name>Phone</Name>
      <Type>Personal</Type>
      <Serial>000000111111</Serial>
      <Identifier>225692067</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Member>
      <Name>John</Name>
      <Address>Kansas</Address>
      <PhoneNumber>5007684306</PhoneNumber>
      <Identifier>699039521</Identifier>
    </Member>
    <Product>
      <Name>Xbox</Name>
      <Type>Personal</Type>
      <Serial>000000222222</Serial>
      <Identifier>699039521</Identifier>
    </Product>
  </Detail>
  <Detail>
    <Member>
      <Name>Larry</Name>
      <Address>Newjersey</Address>
      <PhoneNumber>6004567307</PhoneNumber>
      <Identifier>230903815</Identifier>
    </Member>

    <Dependent>
      <DependentName>Luis</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7897684302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
    <Dependent>
      <DependentName>LuisMead</DependentName>
      <DependentAddress>Miami</DependentAddress>
      <DependentPhoneNumber>7229876302</DependentPhoneNumber>
      <Identifier>230903815</Identifier>
    </Dependent>
    <Product>
      <Name>Iphone</Name>
      <Type>Personal</Type>
      <Serial>0000003333333</Serial>
      <Identifier>230903815</Identifier>
    </Product>
  </Detail>

</ns0:Root>

需要为此编写 XSLT 1.0 代码的建议。

【问题讨论】:

  • 请提出具体问题。
  • 输入文件在 Detail 中有三个记录,顺序为“Member”、“Product”和“Dependent”,由于某种原因,我们变得像每个 Member 和 Product 都被循环到一个细节中并且每个依赖循环到单独的细节。它需要以一种顺序为“成员”、“从属”和“产品”的方式形成,并作为一个组详细信息来。所有记录的公共字段是“标识符”
  • 将此与您当前的 XSLT 一起添加到您的问题中。

标签: xslt biztalk


【解决方案1】:

您可以在 XSLT-1.0 中使用 Muenchian 分组 做到这一点。在 StackOverflow 上搜索它,你会发现很多示例。应用它创建了以下答案:

  • 使用其Identifier 元素值作为键创建具有节点Member|Dependent|Productxsl:key
  • 创建一个 sortingOrder 变量,该变量为内部xsl:for-each 中的条目排序提供索引
  • 用模板匹配复制根节点/ns0:Root
  • 循环遍历xsl:for-eachDetail 元素的所有子元素。该表达式应用 Muenchian Grouping 方法
  • 创建一个Detail 元素并循环遍历前一个xsl:for-each 的结果,该结果按sortingOrder 变量中当前元素名称的出现索引排序。复制其内容。元素排序方法采用from this SO answer: "Sorting XML in XSLT based on a list of values"

样式表可能如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="Test">
<xsl:output indent="yes"/>
<xsl:key name="id" match="Member|Dependent|Product" use="Identifier" />   
<xsl:variable name="sortingOrder" select="'Member,Dependent,Product'" />

<xsl:template match="/ns0:Root">
    <xsl:copy>
        <xsl:for-each select="Detail/*[generate-id() = generate-id(key('id',Identifier)[1])]">
            <Detail>
                <xsl:for-each select="key('id',Identifier)">
                    <xsl:sort data-type="number" select="string-length(substring-before($sortingOrder,local-name()))" />
                    <xsl:copy-of select="."/>
                </xsl:for-each>
            </Detail>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

输出应该符合要求。

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多