метод (XSLT) для группировки узлов по отцовскому элементу

Я хотел бы сгруппировать узлы по отцовским элементам.

Здесь отцовский элемент: FDDCell id="AAA" method="modify"

  • Элемент отца повторяется два раза.

  • Я хотел бы, чтобы «FDDCell id» появлялся только один раз. и сгруппируйте все узлы под «FDDCell id»

Вот входной файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<start>

<FDDCell id="AAA"  method="modify">
<UMTSFddNeighbouringCell id="FAR_AWAY" method="create">
    <attributes>
        <mbmsNeighbouringWeight>0.0</mbmsNeighbouringWeight>
    </attributes>
</UMTSFddNeighbouringCell>
</FDDCell>

<FDDCell id="AAA" method="modify">
<attributes>
    <cacConfId>RadioAccessService/0 DedicatedConf/0 CacConfClass/10</cacConfId>
    <layerPreferredForR99>true</layerPreferredForR99>
    <reserved0>1398341632</reserved0>
    <reserved1>1398352896</reserved1>
    <reserved2>1616994144</reserved2>
    <reserved3>1616994144</reserved3>
</attributes>
</FDDCell>

</start>

Вот желаемый выходной файл:

 <?xml version="1.0" encoding="UTF-8"?>
 <start>

 <FDDCell id="AAA" method="modify">
  <UMTSFddNeighbouringCell id="FAR_AWAY" method="create">
    <attributes>
        <mbmsNeighbouringWeight>0.0</mbmsNeighbouringWeight>
    </attributes>
 </UMTSFddNeighbouringCell>

<attributes>
    <cacConfId>RadioAccessService/0 DedicatedConf/0 CacConfClass/10</cacConfId>
    <layerPreferredForR99>true</layerPreferredForR99>
    <reserved0>1398341632</reserved0>
    <reserved1>1398352896</reserved1>
    <reserved2>1616994144</reserved2>
    <reserved3>1616994144</reserved3>
</attributes>

</FDDCell>
</start>

Большое спасибо за вашу поддержку


person laurentngu    schedule 25.05.2012    source источник


Ответы (1)


Вот таблица стилей XSLT 2.0:

<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:strip-space elements="*"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* , node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="start">
    <xsl:copy>
      <xsl:for-each-group select="FDDCell" group-by="@id">
        <xsl:copy>
          <xsl:apply-templates select="@*, current-group()/node()"/>
        </xsl:copy>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Вы можете запустить это с процессорами XSLT 2.0, такими как Saxon 9, инструменты AltovaXML, XMLPrime.

person Martin Honnen    schedule 27.05.2012