转换XML格式

转换XML格式,xml,xslt,Xml,Xslt,我有一个字符串格式如下的XML: <?xml version="1.0" encoding="utf-8" ?> - <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <

我有一个字符串格式如下的XML:

  <?xml version="1.0" encoding="utf-8" ?> 
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <soap:Body>
- <GetUserLinksResponse xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService">
- <GetUserLinksResult>
- <QuickLinkData>
  <Name>System 1</Name> 
  <Group>General</Group> 
  <Privacy>Private</Privacy> 
  <Url>https://url1.com</Url> 
  <ID>6500</ID> 
  </QuickLinkData>
- <QuickLinkData>
  <Name>System 2</Name> 
  <Group>General</Group> 
  <Privacy>Private</Privacy> 
  <Url>https://url2.com</Url> 
  <ID>6499</ID> 
  </QuickLinkData>
- <QuickLinkData>
  <Name>System 3</Name> 
  <Group>Work</Group> 
  <Privacy>Private</Privacy> 
  <Url>http://url3.com</Url> 
  <ID>6845</ID> 
  </QuickLinkData>
  </GetUserLinksResult>
  </GetUserLinksResponse>
  </soap:Body>
  </soap:Envelope>

- 
- 
- 
- 
- 
系统1
一般的
私有的
https://url1.com 
6500
- 
系统2
一般的
私有的
https://url2.com 
6499
- 
系统3
工作
私有的
http://url3.com 
6845
我希望使用xslt或c#以如下格式显示:


一般的
6500
系统1
https://url1.com
6499
系统2
https://url2.com
工作
6845
系统3
https://url3.com
可能有多个组 如何在c#(使用xslt或任何其他过程)中实现这一点

请帮助…

您应该使用:

首先,我将准备一组集合或更好的新类:Group和Item

在第二阶段,解析源文件,用数据填充集合

最后,从这些类集合使用linq到xml生成所需的文件结构


祝你好运

这个简短而简单的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService"
 exclude-result-prefixes="x">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kGroupByVal" match="x:Group" use="."/>

 <xsl:template match=
   "x:Group[generate-id() = generate-id(key('kGroupByVal',.)[1])]">
  <Group>
   <Value><xsl:value-of select="."/></Value>
   <xsl:apply-templates select="key('kGroupByVal',.)/.." mode="inGroup"/>
  </Group>
 </xsl:template>

 <xsl:template match="x:QuickLinkData" mode="inGroup">
  <Item>
   <ID><xsl:value-of select="x:ID"/></ID>
   <Name><xsl:value-of select="x:Name"/></Name>
   <Url><xsl:value-of select="x:Url"/></Url>
  </Item>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>
<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetUserLinksResponse
          xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService">
            <GetUserLinksResult>
                <QuickLinkData>
                    <Name>System 1</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url1.com</Url>
                    <ID>6500</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 2</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url2.com</Url>
                    <ID>6499</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 3</Name>
                    <Group>Work</Group>
                    <Privacy>Private</Privacy>
                    <Url>http://url3.com</Url>
                    <ID>6845</ID>
                </QuickLinkData>
            </GetUserLinksResult>
        </GetUserLinksResponse>
    </soap:Body>
</soap:Envelope>
<Group>
   <Value>General</Value>
   <Item>
      <ID>6500</ID>
      <Name>System 1</Name>
      <Url>https://url1.com</Url>
   </Item>
   <Item>
      <ID>6499</ID>
      <Name>System 2</Name>
      <Url>https://url2.com</Url>
   </Item>
</Group>
<Group>
   <Value>Work</Value>
   <Item>
      <ID>6845</ID>
      <Name>System 3</Name>
      <Url>http://url3.com</Url>
   </Item>
</Group>

应用于提供的XML文档时:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService"
 exclude-result-prefixes="x">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kGroupByVal" match="x:Group" use="."/>

 <xsl:template match=
   "x:Group[generate-id() = generate-id(key('kGroupByVal',.)[1])]">
  <Group>
   <Value><xsl:value-of select="."/></Value>
   <xsl:apply-templates select="key('kGroupByVal',.)/.." mode="inGroup"/>
  </Group>
 </xsl:template>

 <xsl:template match="x:QuickLinkData" mode="inGroup">
  <Item>
   <ID><xsl:value-of select="x:ID"/></ID>
   <Name><xsl:value-of select="x:Name"/></Name>
   <Url><xsl:value-of select="x:Url"/></Url>
  </Item>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>
<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetUserLinksResponse
          xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService">
            <GetUserLinksResult>
                <QuickLinkData>
                    <Name>System 1</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url1.com</Url>
                    <ID>6500</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 2</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url2.com</Url>
                    <ID>6499</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 3</Name>
                    <Group>Work</Group>
                    <Privacy>Private</Privacy>
                    <Url>http://url3.com</Url>
                    <ID>6845</ID>
                </QuickLinkData>
            </GetUserLinksResult>
        </GetUserLinksResponse>
    </soap:Body>
</soap:Envelope>
<Group>
   <Value>General</Value>
   <Item>
      <ID>6500</ID>
      <Name>System 1</Name>
      <Url>https://url1.com</Url>
   </Item>
   <Item>
      <ID>6499</ID>
      <Name>System 2</Name>
      <Url>https://url2.com</Url>
   </Item>
</Group>
<Group>
   <Value>Work</Value>
   <Item>
      <ID>6845</ID>
      <Name>System 3</Name>
      <Url>http://url3.com</Url>
   </Item>
</Group>

系统1
一般的
私有的
https://url1.com
6500
系统2
一般的
私有的
https://url2.com
6499
系统3
工作
私有的
http://url3.com
6845
生成所需的正确结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService"
 exclude-result-prefixes="x">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kGroupByVal" match="x:Group" use="."/>

 <xsl:template match=
   "x:Group[generate-id() = generate-id(key('kGroupByVal',.)[1])]">
  <Group>
   <Value><xsl:value-of select="."/></Value>
   <xsl:apply-templates select="key('kGroupByVal',.)/.." mode="inGroup"/>
  </Group>
 </xsl:template>

 <xsl:template match="x:QuickLinkData" mode="inGroup">
  <Item>
   <ID><xsl:value-of select="x:ID"/></ID>
   <Name><xsl:value-of select="x:Name"/></Name>
   <Url><xsl:value-of select="x:Url"/></Url>
  </Item>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>
<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetUserLinksResponse
          xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService">
            <GetUserLinksResult>
                <QuickLinkData>
                    <Name>System 1</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url1.com</Url>
                    <ID>6500</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 2</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url2.com</Url>
                    <ID>6499</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 3</Name>
                    <Group>Work</Group>
                    <Privacy>Private</Privacy>
                    <Url>http://url3.com</Url>
                    <ID>6845</ID>
                </QuickLinkData>
            </GetUserLinksResult>
        </GetUserLinksResponse>
    </soap:Body>
</soap:Envelope>
<Group>
   <Value>General</Value>
   <Item>
      <ID>6500</ID>
      <Name>System 1</Name>
      <Url>https://url1.com</Url>
   </Item>
   <Item>
      <ID>6499</ID>
      <Name>System 2</Name>
      <Url>https://url2.com</Url>
   </Item>
</Group>
<Group>
   <Value>Work</Value>
   <Item>
      <ID>6845</ID>
      <Name>System 3</Name>
      <Url>http://url3.com</Url>
   </Item>
</Group>

一般的
6500
系统1
https://url1.com
6499
系统2
https://url2.com
工作
6845
系统3
http://url3.com
说明


正确使用

很抱歉延迟回复,感谢您的实施,它运行良好。。。