0

私はXSLTの世界に慣れていないので、ご容赦ください。次の構造のWebサービスのXML出力があります。

<NotificationListResponse>
    <MessageReceiver ID=15>
        <Services>
          <Service ID=40>
              <...Other Tags Per Service ...>
          </Service>
          <Service ID=38>
              <...Other Tags Per Service ...>
          </Service>
        </Services>
    </MessageReceiver>
    <MessageReceiver ID=18>
        <Services>
          <Service ID=40>
              <...Other Tags Per Service ...>
          </Service>
          <Service ID=38>
              <...Other Tags Per Service ...>
          </Service>
        </Services>
    </MessageReceiver>
</NotificationListResponse>

そして、私はこれを次のようなものに変換したいと思います:

<NotificationListResponse>
    <Services>
        <Service ID=40>
           <Receivers>
             <MessageReceiver ID=15>
               <...Other Tags Per Service ...>
             </MessageReceiver>
             <MessageReceiver ID=18>
               <...Other Tags Per Service ...>
             </MessageReceiver>
           </Receivers> 
          </Service>
          <Service ID=38>
           <Receivers>
             <MessageReceiver ID=15>
               <...Other Tags Per Service ...>
             </MessageReceiver>
             <MessageReceiver ID=18>
               <...Other Tags Per Service ...>
             </MessageReceiver>
           </Receivers> 
          </Service>
    </Services>
</NotificationListResponse>

これが十分に明確であることを願っています。私がやりたいのは、サービスごとにセグメンテーションを行うことです。Webサービスの応答では、主なセグメンテーションは受信側によって行われます。

これは、XMLをオブジェクトに脱滅菌したり、コードで変換したりせずに、XSLTで実行することもできますか?必要に応じて、主なプログラミング言語はC#です。

4

2 に答える 2

0

このような階層の反転は、グループ化の問題の一例です。タスクは、同じIDを持つすべてのMessageReceiver要素を検索し、この値に従って出力をグループ化することであるためです。

XSLT 2.0の方が、XSLT 1.0よりもグループ化がはるかに簡単ですが、どちらの場合も、見出しの質問に対する答えは「はい」です。ただし、ソリューションは大きく異なるため、使用しているバージョンを知っておくと役立ちます。

論理的には、ソリューションの擬似コードはどちらの場合も同じです。

<for each group of Service elements grouped by ID>
  <Service ID=ID>
    <for each Service in the group>
      <process the ancestor MessageReceiver/>
    </
  </
</

XSLT 2.0では、要素を探します<xsl:for-each-group>。XSLT 1.0では、「Muenchiangrouping」に関するチュートリアルを探してください。

于 2012-05-31T09:42:04.590 に答える
0

このようなものは、少し冗長で改善できる可能性がありますが、C# で msxsl を介して機能します。他の人が言ったように、グループ化を別の方法で見るだけです:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

        <xsl:template match="/NotificationListResponse">
            <NotificationListResponse>
            <Services>
                <xsl:for-each select=".//Service">
                    <xsl:variable name="id" select="@ID"/>
                    <xsl:if test="count(preceding::Service[$id]) &lt; 2">
                        <Service ID="{$id}">
                            <Receivers>
                                <xsl:for-each select="//Service[@ID=$id]">
                                    <MessageReciever>
                                        <xsl:attribute name="ID">
                                            <xsl:value-of select="ancestor::MessageReceiver/@ID"/>
                                        </xsl:attribute>
                                        <xsl:copy-of select="*"/>
                                    </MessageReciever>
                                </xsl:for-each>
                            </Receivers>
                        </Service>
                    </xsl:if>
                </xsl:for-each>
            </Services>
            </NotificationListResponse>
        </xsl:template>
    </xsl:stylesheet>
于 2012-05-31T08:40:50.477 に答える