我从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表达式?它会是什么样子?
答案 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>
然后将其连接到地图中,如下所示,它工作正常。
答案 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