1

文字列に以下のような形式の 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>

xsltまたはc#を使用して、以下のような形式で必要です:

<?xml version="1.0" encoding="utf-8" ?> 
<root>
<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>https://url3.com</Url>
</Item>
</Group>
</root>

複数のグループが存在する可能性があります c# でこれを達成するにはどうすればよいですか (xslt またはその他のプロセスを使用)

助けてください...

4

2 に答える 2

2

この短くて単純な変換:

<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>

提供された XML ドキュメントに適用した場合:

<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>

説明:

Muenchian Grouping Methodの適切な使用。

于 2013-04-05T03:36:59.100 に答える