2016-05-31 3 views
0

Так вот мой вклад XML:XSLT 1.0 Копировать атрибут каждого согласующего элемента

<?xml version="1.0" encoding="utf-8"?> 
    <modifs> 
    <modif id="229818"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">par</apres></modif> 
    <modif id="196216"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">parmi</apres></modif> 
    <modif id="2162"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">pour</apres></modif> 
    <modif id="9273"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">pour</apres></modif> 
</modifs> 

В основном то, что я хочу сделать, это скопировать все, за исключением дублированного контента. Для указанного дублированного содержимого я хотел бы сгруппировать различные идентификаторы в первом элементе того же типа. В результате я хотел бы получить было бы что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?> 
    <modifs> 
    <modif id="229818"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">par</apres></modif> 
    <modif id="196216"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">parmi</apres></modif> 
    <modif id="2162"> 
<extra_id="9273"> 
<avant num_words="1">dans</avant> 
<apres num_words="1">pour</apres></modif> 
</modifs> 

А вот моя попытка до сих пор: Я пытаюсь проверить сначала, если есть уже дубликата (если да, то ничего не делать), затем, если после этого есть дубликаты. Если они есть, получите атрибут id и скопируйте его. (Вот чего я не знаю, как это сделать). Наконец, если нет дубликатов, просто скопируйте элемент.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="modifs"> 
    <xsl:for-each select="./modif"> 
     <xsl:choose> 
     <xsl:when test="./avant=preceding-sibling::modif/avant"> 
      <xsl:if test="./apres=preceding-sibling::modif/apres"> 
      </xsl:if> 
     </xsl:when> 
     <xsl:when test="./avant=following-sibling::modif/avant"> 
      <xsl:if test="./apres=following-sibling::modif/apres"> 
      <xsl:element name="modif"> 
      <xsl:for-each select="following-sibling::modif/@id=./@id"> 
       <xsl:value-of select="."/>    
      </xsl:for-each> 
       <xsl:copy-of select="."/> 
       </xsl:element> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:copy-of select="."/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Я не знаю, если мой вопрос ясен, если нет, или если есть какие-либо другие проблемы с ним (или с моим английским), пожалуйста, скажите мне, я с удовольствием его изменить.

Благодаря

+2

Я хотел бы предложить вам начать здесь: http://www.jenitennison.com/ xslt/grouping/muenchian.html –

ответ

1

Вы можете попробовать это Muenchian grouping:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

     <xsl:key name="kmodif" match="modif" use="concat(avant, '|', apres)"/> 

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

     <xsl:template match="/modifs"> 
      <xsl:copy> 
       <xsl:for-each 
        select="modif[generate-id() = generate-id(key('kmodif', concat(avant, '|', apres))[1])]" > 
        <!-- group --> 
        <xsl:copy> 
         <xsl:apply-templates select="@*" /> 

         <xsl:for-each 
          select="key('kmodif', concat(avant, '|', apres))[position() != 1]" > 
          <!-- group member--> 
          <extra id="{@id}" /> 
         </xsl:for-each> 
         <xsl:apply-templates select="*" /> 
        </xsl:copy> 
        </xsl:for-each> 
      </xsl:copy> 
     </xsl:template> 
    </xsl:stylesheet> 

следующие выходные:

 <modifs> 
      <modif id="229818"> 
       <avant num_words="1">dans</avant> 
       <apres num_words="1">par</apres> 
      </modif> 
      <modif id="196216"> 
       <avant num_words="1">dans</avant> 
       <apres num_words="1">parmi</apres> 
      </modif> 
      <modif id="2162"> 
       <extra id="9273"/> 
       <avant num_words="1">dans</avant> 
       <apres num_words="1">pour</apres> 
      </modif> 
     </modifs> 
+0

Кажется, отлично работает! Большое спасибо за этот ответ! – Azaghal

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