объединение нескольких узлов атрибутов с одинаковым значением - PullRequest
0 голосов
/ 11 июня 2019

Можете ли вы помочь мне, как это сделать XML: XML выглядит как

    <a name="hr_1" id="hr">
    <text>11</text>
    </a>
    <a name="hr_2" id="hr">
    <text>12</text>
    </a>

    <a name="hre_1" id ="hre">
    <text>11</text>
    </a>
    <a name="hre_2" id ="hre">
    <text>12</text>
    </a>

ожидаемый выход: преобразованный выход ожидается как ниже

    <b name ="hr">
    <value>11</value>
    <value>12</value>
    </b>

    <b name ="hre">
    <value>11</value>
    <value>12</value>
    </b>

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Из комментария:

Большое спасибо ... Как я могу сделать это в xslt 1.0 .. Также я добавил один больше идентификатора тега, поэтому мне нужно сгруппировать на основе идентификатора. Пожалуйста, помогите в xslt 1.0

В XSLT 1.0 используйте Muenchian Grouping . Я хотел бы создать ключ, соответствующий всем элементам text и используя атрибут id родительского элемента ...

XML

<doc>
    <a name="hr_1" id="hr">
        <text>11</text>
    </a>
    <a name="hr_2" id="hr">
        <text>12</text>
    </a>    
    <a name="hre_1" id ="hre">
        <text>11b</text>
    </a>
    <a name="hre_2" id ="hre">
        <text>12b</text>
    </a>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="kText" match="text" use="../@id"/>

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

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each select="*/text[count(.|key('kText',../@id)[1])=1]">
        <b name="{../@id}">
          <xsl:apply-templates select="key('kText',../@id)"/>
        </b>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

выход

<doc>
   <b name="hr">
      <text>11</text>
      <text>12</text>
   </b>
   <b name="hre">
      <text>11b</text>
      <text>12b</text>
   </b>
</doc>
1 голос
/ 11 июня 2019

Похоже на простую задачу группировки, которую можно решить в XSLT 2 или 3 с помощью xsl:for-each-group:

  <xsl:template match="root">
      <xsl:copy>
          <xsl:for-each-group select="a" group-by="substring-before(@name, '_')">
              <b name="{current-grouping-key()}">
                  <xsl:copy-of select="current-group()/*"/>
              </b>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

Предполагается, что root является общим элементом контейнера для элементов a, которые нужно сгруппировать,адаптируйте это по мере необходимости.

...