Сортировка сущностей в сложном XML в BizTalk - PullRequest
0 голосов
/ 29 октября 2010

Я получаю некоторые данные от WebService, который выглядит следующим образом

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

Перед дальнейшей обработкой и преобразованием этого сообщения мне нужно отсортировать подузлы («Офис» и «Рабочий») так, чтобы все офисы сортировались по CreationDate, а затем все работники сортировались по HiringDate внутри их Office. .

Пока что единственные решения, которые я видел для сортировки в BizTalk, были основаны на XSLT. Некоторые примеры показывают, как сортировать по более простой структуре (http://www.biztalkgurus.com/newsletter/TheBizTalker-Volume-03.html), но они не будут работать как есть, так как мое сообщение имеет несколько уровней.

Если вы не знаете, как (если это вообще возможно) написать выражение XSLT, которое будет выполнять эту сортировку, сохраняя при этом структуру XML.

Можно ли написать такое выражение XSLT? Как бы это выглядело?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Нашел решение здесь: 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

0 голосов
/ 29 октября 2010

Вам необходимы шаблоны копирования 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>

и аналог для тега Worker

<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 или строку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...