Слияние узлов XML - PullRequest
       3

Слияние узлов XML

3 голосов
/ 03 ноября 2011

У меня есть исходный xml в следующем формате:

 <xml>
   <node>
         <va-name>
               <source area="RSC1985s5c1"/>
         </va-name>
         <body>
              <div >
                  <heading>heading 1</heading>
               </div>
         </body>
   </node>
   <node>
         <va-name>
               <source area="RSC1985s5c2"/>
         </va-name>
         <body>
              <div >
                  <heading>heading 2</heading>
               </div>
         </body>
   </node>

   <node>
         <va-name>
               <source area="RSC1985s5c1"/>
         </va-name>
         <body>
              <div >
                  <heading>heading 3</heading>
               </div>
         </body>
   </node>

<xml>

Я хочу объединить узлы, если значения xml / node / va-name / source [@area] равны среди разных xml/узел.Мне нужно скопировать только xml / node / body и объединить их в первый узел.

Вывод должен быть:

 <xml>
   <node>
         <va-name>
               <source area="RSC1985s5c1"/>
         </va-name>
         <body>
              <div >
                  <heading> heading 1 </heading>
               </div>
               <div >
                  <heading> heading 3 </heading>
               </div>
         </body>
   </node>
    <node>
         <va-name>
               <source area="RSC1985s5c2"/>
         </va-name>
         <body>
              <div >
                  <heading>heading 2</heading>
               </div>
         </body>
   </node>
 </xml>

В выводе выше узел 1 и узел 3 имеют одинаковыеxml / node / va-name / source [@area], поэтому в выводе я объединил оба, и узел 2 будет выведен как есть.Если у меня есть больше узлов и если какой-либо из них соответствует (xml / node / va-name / source [@area]) с узлом 2, то мы объединяем его с узлом 2 и так далее ...

Ценю, могу ли я получить какую-либо помощь ...

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Очень простое решение для группировки в XSLT 2.0:

<xsl:template match="xml">
<xml>
  <xsl:for-each-group select="node" group-by="va-name/source/@area">
  <node>
    <xsl:copy-of select="va-name"/>
    <body>
      <xsl:copy-of select="current-group()/body/*"/>
    </body>
  </node>
  </xsl:for-each-group>
</xml>
</xsl:template>
0 голосов
/ 03 ноября 2011

Это YAGP (еще одна проблема группирования), лучше всего решаемая с помощью метода Мюнхена . Эта таблица стилей дает желаемый результат:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="byArea" match="node" use="va-name/source/@area" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template
        match="node[generate-id()=
                    generate-id(key('byArea', va-name/source/@area)[1])]">
        <node>
            <xsl:apply-templates select="va-name" />
            <body>
                <xsl:apply-templates select="key('byArea', va-name/source/@area)"
                    mode="out" />
            </body>
        </node>
    </xsl:template>
    <xsl:template match="node" mode="out">
        <xsl:apply-templates select="body/div" />
    </xsl:template>
    <xsl:template match="node" />
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...