Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在BizTalk中对复杂XML中的子实体进行排序_Biztalk_Xslt - Fatal编程技术网

在BizTalk中对复杂XML中的子实体进行排序

在BizTalk中对复杂XML中的子实体进行排序,biztalk,xslt,Biztalk,Xslt,我从一个Web服务中获取一些数据,如下所示 Building Address -> Office Name CreationDate -> Worker Name HiringDate 在对该消息进行进一步处理和转换之前,我需要对子节点(“Office”和“Worker”)进行排序,以便所有办公室都按CreationDate排序,然后所有员工都按其办公

我从一个Web服务中获取一些数据,如下所示

Building
     Address
     -> Office
         Name
         CreationDate
         -> Worker
              Name
              HiringDate 
在对该消息进行进一步处理和转换之前,我需要对子节点(“Office”和“Worker”)进行排序,以便所有办公室都按CreationDate排序,然后所有员工都按其办公室内的HiringDate排序

到目前为止,我在BizTalk中看到的唯一排序解决方案是基于XSLT的。有一些示例演示了如何在更简单的结构()上进行排序,但这些示例无法正常工作,因为我的消息有几个级别

如果您不知道如何(如果可能的话)编写一个XSLT表达式来进行排序,同时保留XML的结构


可以编写这样的XSLT表达式吗?它看起来像什么?

您需要一个XSLT副本,用于所有标记(不包括Office和Worker)的模板,以及用于该标记的排序模板。如 复制模板:

<xsl:template match="node()">
    <xsl:if test="name()">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:if>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="@*">
    <xsl:copy>
        <xsl:value-of select="."/>
    </xsl:copy>
</xsl:template>
<xsl:match="office_parent_tag_as_i_understand_Building">
    <xsl:apply-templates select="Office">
        <xsl:sort select="CreationDate" data-type="text" order="ascending"/>
    </xsl:foreach>
</xsl:template>

和排序模板:

<xsl:template match="node()">
    <xsl:if test="name()">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:if>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="@*">
    <xsl:copy>
        <xsl:value-of select="."/>
    </xsl:copy>
</xsl:template>
<xsl:match="office_parent_tag_as_i_understand_Building">
    <xsl:apply-templates select="Office">
        <xsl:sort select="CreationDate" data-type="text" order="ascending"/>
    </xsl:foreach>
</xsl:template>

&工人标签模拟

<xsl:match="worker_parent_tag_as_i_understand_Office">
    <xsl:apply-templates select="Worker">
        <xsl:sort select="HiringDate" data-type="text" order="ascending"/>
    </xsl:foreach>
</xsl:template>

不要忘记xsl:sort仅适用于数字和文本数据,要按日期排序,您需要将日期转换为int或string

如果我们将这种技术应用到我们的示例中,就会得到这个XSLT

    <xsl:for-each select="Office">
        <xsl:sort select="CreationDate" data-type="text" order="ascending"/>        
        <Office>
            <xsl:copy-of select="Name"/>
            <xsl:copy-of select="CreationDate"/>
            <xsl:for-each select="Worker">
                <xsl:sort select="HiringDate" data-type="text" order="ascending"/>
                <Worker>
                    <xsl:copy-of select="Name"/>
                    <xsl:copy-of select="HiringDate"/>
                </Worker>
            </xsl:for-each>
        </Office>
    </xsl:for-each>

然后把它挂在地图上,如下图所示,它就可以正常工作了。

请发布一个小的xml文档和想要的xml结果。我不确定您将如何在biztalk中输入所有XSLT(它只有一个用于内联XSLT的脚本窗口,并且似乎不接受其中的模板对象)。在这种情况下,如何将输出连接到右侧模式?