2017-08-29 194 views
1

我最近遇到了一个问题,我还没有找到一个好的解决方案。XSLT扁平列表树层次结构

Iam给出了一个平面层次结构的XML文件,并希望将其转换为定义的层次结构。

<xml_file> 
<dd/> 
<b/> 
<b/> 
<dd/> 
<b/> 
<b/> 
<dd/> 
<k/> 
<b/> 
<b/> 
<dd/> 
<b/> 
<b/> 
</xml_file> 

我想要把它变成:

<xml_file> 
    <dd> 
     <b/> 
     <b/> 
    </dd> 
    <dd> 
     <b/> 
     <b/> 
    </dd> 
    <dd> 
     <k> 
      <b/> 
      <b/> 
     </k> 
    </dd> 
    <dd> 
     <b/> 
     <b/> 
    </dd> 
</xml_file> 

什么是做到这一点使用XSLT 2.0的最佳方式?

非常感谢你的帮助。

编辑:

对不起。我没有真正地解释它..

Iam给出了列表中的元素列表,它们按它们的订单组织在列表中。

所有B的K公司的DD应该是前面的DD的孩子。

所有B A ķ后的都应该是前ķ孩子。

+0

您的XML示例是否真正代表您的实际XML?目前,它不是格式良好的,因为(除'xml_file'外)没有任何标签具有关联标签,这意味着XSLT将无法处理它。 –

+0

您需要解释层次结构“定义”的逻辑。 –

+0

感谢您的回复。我更新了我的问题的描述。 – caloemar

回答

1

您可以使用

<xsl:template match="xml_file"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-starting-with="dd"> 
      <xsl:copy> 
       <xsl:for-each-group select="current-group() except ." group-starting-with="k"> 
        <xsl:choose> 
         <xsl:when test="self::k"> 
          <xsl:copy> 
           <xsl:apply-templates select="current-group() except ."/> 
          </xsl:copy> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:apply-templates select="current-group()"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each-group> 
      </xsl:copy> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

加上身份转换模板。