我是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>
我希望这很清楚。我想要做的是按服务进行细分,在网络服务响应中,主要细分由接收方进行。
这是否可以在XSLT中完成,而不将XML纳入对象并在代码中进行转换?我们的主要编程语言是C#,如果相关的话。
答案 0 :(得分: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]) < 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>
答案 1 :(得分: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中,查找有关“Muenchian分组”的教程