2016-12-04 131 views
0

我想要使用多个头,细节和浏览更详细信息的节点将XML。每个节点都包含关键的“ID”以将它们连接在一起。
这似乎很简单,但它不适合我。XSLT基的基于ID值子

开始与下面的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<File> 
    <Header> 
     <Id>1</Id> 
     <Other>How</Other> 
    </Header> 
    <Detail> 
     <Id>1</Id> 
     <Other>to</Other> 
    </Detail> 
    <MoreDetails> 
     <Id>1</Id> 
     <Other>group</Other> 
    </MoreDetails> 
    <Header> 
     <Id>2</Id> 
     <Other>How</Other> 
    </Header> 
    <Detail> 
     <Id>2</Id> 
     <Other>to</Other> 
    </Detail> 
    <MoreDetails> 
     <Id>2</Id> 
     <Other>group</Other> 
    </MoreDetails> 
    <MoreDetails> 
     <Id>2</Id> 
     <Other>may have multiples</Other> 
    </MoreDetails> 
</File> 

生成类似以下或者与组1,组2等,或组值= 1,组值= 2等

<?xml version="1.0" encoding="UTF-8"?> 
<File> 
    <Group value="1"> 
     <Header> 
      <Id>1</Id> 
      <Other>How</Other> 
     </Header> 
     <Detail> 
      <Id>1</Id> 
      <Other>to</Other> 
     </Detail> 
     <MoreDetails> 
      <Id>1</Id> 
      <Other>group</Other> 
     </MoreDetails> 
    </Group> 
    <Group value="2"> 
     <Header> 
      <Id>2</Id> 
      <Other>How</Other> 
     </Header> 
     <Detail> 
      <Id>2</Id> 
      <Other>to</Other> 
     </Detail> 
     <MoreDetails> 
      <Id>2</Id> 
      <Other>group</Other> 
     </MoreDetails> 
     <MoreDetails> 
      <Id>2</Id> 
      <Other>with multiple child</Other> 
     </MoreDetails> 
    </Group> 
</File> 

我开始与这样的事情,

<xsl:template match="/File"> 

     <xsl:for-each-group select="./child::*" group-by="Id"> 
      <xsl:variable name="ID" select="Id"/> 
      <xsl:value-of select="current-grouping-key()"/> 

和变化使用变量和键名称,但我不是能够按照指定输出。

任何想法非常欢迎。 在此先感谢 -ac

回答

2

您需要使用current-group()访问组中的节点。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="/File"> 
    <File> 
     <xsl:for-each-group select="./child::*" group-by="Id"> 
     <Group value="{Id}"> 
      <xsl:copy-of select="current-group()"/> 
     </Group> 
     </xsl:for-each-group> 
    </File> 
    </xsl:template> 
</xsl:stylesheet> 
+0

这伟大工程。我最近的是这个(下面),但最后一个节点没有正确形成。感谢您的完美解决方案。 – user1375987

+0

啊,不能发布我的XSL ..你是无论如何更好。再次感谢。 – user1375987