2016-08-04 1 views
0

У меня есть пример сообщения, в котором мне нужно удалить дубликат в блоке temperatureInformation и temperatureStats.Удаление дубликатов в родительском и дочернем объекте в XSLT

Сообщение образца

<document> 
<body> 
    <party> 
     <gtin>1000909090</gtin> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909090</gtin> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE1</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE2</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE1</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE3</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE5</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE6</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE7</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE8</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
      </attrGroupMany> 
     </pos> 
    </party>  
</body> 
</document> 

Я использую ниже XSLT, в котором дубликат родителя, который temperatureInformation удаляется, но продублировать в дочерних temperatureStats не удаляется

Ожидаемый выход составляет

<document> 
<body> 
    <party> 
     <gtin>1000909090</gtin> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909090</gtin> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE1</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE2</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE3</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE5</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE6</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrGroupMany name="temperatureStats"> 
         <row> 
          <attr name="StatsCode">CODE7</attr> 
         </row> 
         <row> 
          <attr name="StatsCode">CODE8</attr> 
         </row> 
        </attrGroupMany> 
       </row> 
      </attrGroupMany> 
     </pos> 
    </party>  
</body> 
</document> 

XSLT используется

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 



    <xsl:key name="grouptemperatureInformation" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row" 
    use="concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/> 

    <xsl:key name="grouptemperatureStats" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row/attrGroupMany[@name = 'temperatureStats']/row" 
    use="concat(generate-id(ancestor::pos), '|', attr[@name = 'StatsCode'])"/> 

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

    <xsl:template match="attrGroupMany[@name = 'temperatureInformation']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="row[generate-id() = generate-id(key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="attrGroupMany[@name = 'temperatureStats']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|',../attr[@name = 'temperatureCode'], '|', ../attrQualMany[@name = 'temperature']))/attrGroupMany[@name = 'temperatureStats']/row"/> 

      <!-- <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="row[generate-id() = generate-id(key('grouptemperatureStats', concat(generate-id(ancestor::pos), '|', attr[@name = 'StatsCode']))[1])]"/> --> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Может ли кто-нибудь вести меня туда, где я ошибаюсь.

+1

Я старался анализировать ввод/вывод/XSLT, но не мог понять многое. Можете ли вы попытаться объяснить свою проблему более наглядным образом. –

+0

Конкатентное значение температурыКод и температура повторяются для строк 1 и 2. Он удаляется из XSLT, который я упомянул, но corressponding StatsCode, который является дублирующим (имеющий значение CODE1 в двух местах), не удаляется. Я снова обновил XSLT в вопросе. – Victor

+0

Я чувствую, что способ, используемый для удаления, не является надежным. Если ваши элементы 'attrQualMany [@name = 'temperature']/value' не находятся в том же порядке, что и предыдущие, или один из них отсутствует, они не будут считаться дублирующими. –

ответ

1

Как и удаление повторяющихся элементов «TemperatureInformation», для каждого такого отдельного элемента похоже, что вы хотите объединить отдельные элементы «temperatureStats» для всех элементов в группе.

Поскольку это второй уровень группировки, ключ для этого нужно будет принять в первом уровне группировки тоже, и поэтому выглядеть следующим образом:

<xsl:key name="grouptemperatureStats" 
     match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row/attrGroupMany[@name = 'temperatureStats']/row" 
     use="concat(generate-id(ancestor::pos), '|', ../../../attr[@name = 'temperatureCode'], '|', ../../../attrQualMany[@name = 'temperature'], '|', attr[@name = 'StatsCode'])"/> 

Чтобы использовать его, в согласовании шаблона элемент «temperatureStats», вы бы сначала выбрать все элементы в текущей родительской группе

<xsl:variable name="group" 
        select="key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|', ../attr[@name = 'temperatureCode'], '|', ../attrQualMany[@name = 'temperature']))/attrGroupMany[@name='temperatureStats']/row" /> 

Тогда вы могли бы выбрать различный «temperatureStats» элементы в этом, используя второй ключ

<xsl:apply-templates select="@* | $group[generate-id() = generate-id(key('grouptemperatureStats', concat(generate-id(ancestor::pos), '|', ../../../attr[@name = 'temperatureCode'], '|', ../../../attrQualMany[@name = 'temperature'], '|', attr[@name = 'StatsCode']))[1])]"/> 

Попробуйте этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:key name="grouptemperatureInformation" 
      match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row" 
      use="concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/> 

    <xsl:key name="grouptemperatureStats" 
      match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row/attrGroupMany[@name = 'temperatureStats']/row" 
      use="concat(generate-id(ancestor::pos), '|', ../../../attr[@name = 'temperatureCode'], '|', ../../../attrQualMany[@name = 'temperature'], '|', attr[@name = 'StatsCode'])"/> 

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

    <xsl:template match="attrGroupMany[@name = 'temperatureInformation']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="row[generate-id() = generate-id(key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="attrGroupMany[@name = 'temperatureStats']"> 
     <xsl:variable name="group" select="key('grouptemperatureInformation', concat(generate-id(ancestor::pos), '|', ../attr[@name = 'temperatureCode'], '|', ../attrQualMany[@name = 'temperature']))/attrGroupMany[@name='temperatureStats']/row" /> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | $group[generate-id() = generate-id(key('grouptemperatureStats', concat(generate-id(ancestor::pos), '|', ../../../attr[@name = 'temperatureCode'], '|', ../../../attrQualMany[@name = 'temperature'], '|', attr[@name = 'StatsCode']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо Это сработало. В одном месте было добавлено дополнительное ../, которое я отредактировал и удалил. – Victor

 Смежные вопросы

  • Нет связанных вопросов^_^