在BizTalk中对复杂XML中的子实体进行排序
我从一个Web服务中获取一些数据,如下所示在BizTalk中对复杂XML中的子实体进行排序,biztalk,xslt,Biztalk,Xslt,我从一个Web服务中获取一些数据,如下所示 Building Address -> Office Name CreationDate -> Worker Name HiringDate 在对该消息进行进一步处理和转换之前,我需要对子节点(“Office”和“Worker”)进行排序,以便所有办公室都按CreationDate排序,然后所有员工都按其办公
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的脚本窗口,并且似乎不接受其中的模板对象)。在这种情况下,如何将输出连接到右侧模式?