Сортировка / перестановка в XSLT - PullRequest
0 голосов
/ 12 октября 2018

У меня есть XML-файл, который (вместе с заголовком) имеет несколько узлов CC, а каждый узел CC имеет несколько дочерних узлов, как показано ниже:

<File>
    <Header/>
    <CC>
        <Div>
        <SubDiv>
        <Com>
        <Reg>
        <CCOrder> 
    </CC>  
    <CC>
        <Div>
        <SubDiv>
        <Com>
        <Reg>
        <CCOrder> 
    </CC>  
    <CC>
        <Div>
        <SubDiv>
        <Com>
        <Reg>
        <CCOrder> 
    </CC>  
<File>

Я хочу переставить / отсортировать XSLT так, чтобыформат выглядит следующим образом (каждый дочерний узел в узлах CC сгруппирован в порядке возрастания):

 <File>
    <Header/> 
    <CCDiv>
        <Div1>
        <Div2>
        <Div3>
    </CCDiV>
    <CCSubDiv>
        <SubDiv1>
        <SubDiv2>
        <SubDiv3>
    </CCSubDiv>
    <CCCom>
        <Com1>
        <Com2>
        <Com3>
<File> 

и т. д. для узлов Reg и CCOrder.

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 12 октября 2018

Предполагая XSLT 2 или 3, вы можете использовать for-each-group select="CC/*" group-by="node-name(.)":

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

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="File">
      <xsl:copy>
          <xsl:for-each-group select="CC/*" group-by="node-name(.)">
              <xsl:element name="{local-name(..)}{current-grouping-key()}">
                  <xsl:apply-templates select="current-group()"/>
              </xsl:element>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="CC/*">
      <xsl:element name="{name()}{position()}"></xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / eiZQaG1

...