Azure 集成帐户 (Maps - XSLT) - 使用逻辑应用将 2 个不同的 XML 合并为单个 xml

Posted

技术标签:

【中文标题】Azure 集成帐户 (Maps - XSLT) - 使用逻辑应用将 2 个不同的 XML 合并为单个 xml【英文标题】:Azure integration account (Maps - XSLT) - Merge 2 different XMLs into single xml with Logic Apps 【发布时间】:2020-02-27 01:34:20 【问题描述】:

在 Azure 逻辑应用程序中,我有 2 个 不同 xml 文件 Parent.xml 和 Children.xml JSON 格式。

要求 - 我需要使用存储在集成帐户中的 XSLT 创建将这 2 个文件合并到单个 Family.xml 文件中。

**在使用用于自定义代码逻辑的内置 C# 代码创建 XSLT 时需要帮助。此 XSLT 需要放置在 Azure 集成帐户的映射中。 **

以下是示例:-

Parent.xml

    <ParentRoot>
     <ParentName>
      <Father>
        <FirstName>FFirstName</FirstName>
        <LastName>FLastName</LastName>
        <Age>35</Age>
      </Father>
      <Mother>
        <FirstName>MFirstName</FirstName>
        <LastName>MLastName</LastName>
        <Age>33</Age>
      </Mother>
     </ParentName>            
    </ParentRoot>

Children.xml

<ChildrenRoot>
<Child>
    <FirstName>Child1FirstName</FirstName>
    <LastName>Child1LastName</LastName>
    <Age>14</Age>
</Child>
<Child>
    <FirstName>Child2FirstName</FirstName>
    <LastName>Child2LastName</LastName>
    <Age>10</Age>
</Child>
</ChildrenRoot>

Family.xml

<FamilyRoot>
  <ParentName>
          <Father>
            <FirstName>FFirstName</FirstName>
            <LastName>FLastName</LastName>
            <Age>35</Age>
          </Father>
          <Mother>
            <FirstName>MFirstName</FirstName>
            <LastName>MLastName</LastName>
            <Age>33</Age>
          </Mother>
  </ParentName>
<TotalChildren>2</TotalChildren>
<ChildrenCollection>
    <Child>
        <FirstName>Child1FirstName</FirstName>
        <LastName>Child1LastName</LastName>
        <Age>14</Age>
    </Child>
    <Child>
        <FirstName>Child2FirstName</FirstName>
        <LastName>Child2LastName</LastName>
        <Age>10</Age>             
    </Child>
</ChildrenCollection>     
</FamilyRoot>

【问题讨论】:

【参考方案1】:

首先我认为你最好将两个xml资源合并为一个xml作为逻辑应用程序中的资源,如下所示:

<root>
    <ParentRoot>
         <ParentName>
              <Father>
                <FirstName>FFirstName</FirstName>
                <LastName>FLastName</LastName>
                <Age>35</Age>
              </Father>
              <Mother>
                <FirstName>MFirstName</FirstName>
                <LastName>MLastName</LastName>
                <Age>33</Age>
              </Mother>
         </ParentName>            
    </ParentRoot>

    <ChildrenRoot>
        <Child>
            <FirstName>Child1FirstName</FirstName>
            <LastName>Child1LastName</LastName>
            <Age>14</Age>
        </Child>
        <Child>
            <FirstName>Child2FirstName</FirstName>
            <LastName>Child2LastName</LastName>
            <Age>10</Age>
        </Child>
    </ChildrenRoot>
</root>

然后我写了一个xsl代码来转换xml供大家参考:

<?xml version="1.0" encoding="ISO-8859-1"?>
<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:template match="/">
        <xsl:element name="FamilyRoot">
            <xsl:element name="ParentName">
                <xsl:element name="Father">
                    <xsl:element name="FirstName">
                        <xsl:value-of select="root/ParentRoot/ParentName/Father/FirstName" />
                    </xsl:element>
                    <xsl:element name="LastName">
                        <xsl:value-of select="root/ParentRoot/ParentName/Father/LastName" />
                    </xsl:element>
                    <xsl:element name="Age">
                        <xsl:value-of select="root/ParentRoot/ParentName/Father/Age" />
                    </xsl:element>
                </xsl:element>
                <xsl:element name="Mother">
                    <xsl:element name="FirstName">
                        <xsl:value-of select="root/ParentRoot/ParentName/Father/FirstName" />
                    </xsl:element>
                    <xsl:element name="LastName">
                        <xsl:value-of select="root/ParentRoot/ParentName/Father/LastName" />
                    </xsl:element>
                    <xsl:element name="Age">
                        <xsl:value-of select="root/ParentRoot/ParentName/Father/Age" />
                    </xsl:element>
                </xsl:element>
            </xsl:element>

            <xsl:element name="TotalChildren">
                <xsl:value-of disable-output-escaping="yes" select="count(//Child)"/>
            </xsl:element>

            <xsl:element name="ChildrenCollection">
                <xsl:for-each select="root/ChildrenRoot/Child">
                    <xsl:element name="Child">
                        <xsl:element name="FirstName">
                            <xsl:value-of select="FirstName" />
                        </xsl:element>
                        <xsl:element name="LastName">
                            <xsl:value-of select="LastName" />
                        </xsl:element>
                        <xsl:element name="Age">
                            <xsl:value-of select="Age" />
                        </xsl:element>
                    </xsl:element>
                </xsl:for-each>
            </xsl:element>

        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

之后,我们可以将上面的 xsl 代码作为地图上传到集成帐户,并在逻辑应用中使用“Transform XML”操作来转换 xml 资源。

希望对你的问题有所帮助~

【讨论】:

感谢您对转换部分的回复。我也在寻求帮助,我如何在 XSLT 中包含自定义 C# 函数,然后在 xsl 标签中调用。我在示例示例中还有许多其他附加标签,我需要根据一些逻辑对其进行计算。 @Varun05,是的,我认为通过 c# 函数解决它是一个更好的解决方案。我们在逻辑应用中做到这一点并不容易。 主要我需要了解如何从XSLT调用Azure集成帐户的程序集部分上传的C#程序集的方法。此 XSLT 也位于 Azure 集成帐户的 Maps 部分中

以上是关于Azure 集成帐户 (Maps - XSLT) - 使用逻辑应用将 2 个不同的 XML 合并为单个 xml的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD B2C 与企业 (Azure?) AD 帐户集成

Azure Web App VNet 与具有专用链接的存储帐户集成

如何调整 Azure Maps 以获得正确的位置?

如何在 Azure DevOps 的 OWASP ZAP 扫描中使用 XSLT 文件添加误报?

限制从 Azure 函数子网访问存储帐户

集成 Azure 服务总线主题和 Azure 函数