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

时间:2010-10-29 12:09:30

标签: biztalk xslt

我从WebService获取一些数据,看起来像这样

Building
     Address
     -> Office
         Name
         CreationDate
         -> Worker
              Name
              HiringDate 

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

到目前为止,我在BizTalk中看到的唯一解决方案是基于XSLT。有一些示例显示如何对更简单的结构(http://www.biztalkgurus.com/newsletter/TheBizTalker-Volume-03.html)进行排序,但由于我的消息有多个级别,因此这些样本将无法正常工作。

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

是否可以编写这样的XSLT表达式?它会是什么样子?

2 个答案:

答案 0 :(得分:2)

在这里找到解决方案: http://bloggingabout.net/blogs/wellink/archive/2005/12/09/10499.aspx

如果我们将该技术应用于我们的示例,我们将获得此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>

然后将其连接到地图中,如下所示,它工作正常。 alt text

答案 1 :(得分:0)

您需要为所有标记排除Office和Worker以及该标记的排序模板的XSLT副本模板。例如 复制模板:

<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