2015-06-11 2 views
0

Я хочу разбить XmlDocument на массив XmlDocuments, где каждый разбитый XmlDocument содержит записи определенного периода (комбинация Год/Месяц). Усложняющим фактором, imo, является то, что группировка должна происходить на вложенных элементах.Группировка и разбиение Xmldocument на потомок n-го уровня

Пример ввода:

<?xml version="1.0" encoding="utf-8"?> 
<Example> 
    <RecordA> 
    <RecordA1> 
     <RecordA11> 
     <ElementA11></ElementA11> 
     </RecordA11> 
    </RecordA1> 
    <RecordA2> 
     <ElementA2></ElementA2> 
    </RecordA2> 
    </RecordA> 
    <RecordB> 
    <RecordB1> 
     <ElementB1></ElementB1> 
     <RecordB11> 
     <ElementB11></ElementB11> 
     <RecordB111> 
      <RecordB1111> 
      <RecordB11111> 
       <ElementB11111></ElementB11111> 
      </RecordB11111> 
      <ElementB1111></ElementB1111> 
      <RecordB11112> 
       <Dates> 
       <StartDate>2014-05-29</StartDate> 
       <EndDate>2014-05-29</EndDate> 
       </Dates> 
      </RecordB11112> 
      <RecordB11112> 
       <Dates> 
       <StartDate>2014-06-02</StartDate> 
       <EndDate>2014-06-02</EndDate> 
       </Dates> 
      </RecordB11112> 
      <RecordB11112> 
       <Dates> 
       <StartDate>2014-05-21</StartDate> 
       <EndDate>2014-05-21</EndDate> 
       </Dates> 
      </RecordB11112> 
      <RecordB11112> 
       <Dates> 
       <StartDate>2014-04-09</StartDate> 
       <EndDate>2014-04-09</EndDate> 
       </Dates> 
      </RecordB11112> 
      <RecordB11112> 
       <Dates> 
       <StartDate>2014-06-05</StartDate> 
       <EndDate>2014-06-05</EndDate> 
       </Dates> 
      </RecordB11112> 
      </RecordB1111> 
     </RecordB111> 
     </RecordB11> 
    </RecordB1> 
    </RecordB> 
</Example> 

Wanted выход:

<?xml version="1.0" encoding="utf-8"?> 
<Examples> 
    <Example> 
    <RecordA> 
     <RecordA1> 
     <RecordA11> 
      <ElementA11></ElementA11> 
     </RecordA11> 
     </RecordA1> 
     <RecordA2> 
     <ElementA2></ElementA2> 
     </RecordA2> 
    </RecordA> 
    <RecordB> 
     <RecordB1> 
     <ElementB1></ElementB1> 
     <RecordB11> 
      <ElementB11></ElementB11> 
      <RecordB111> 
      <RecordB1111> 
       <RecordB11111> 
       <ElementB11111></ElementB11111> 
       </RecordB11111> 
       <ElementB1111></ElementB1111> 
       <RecordB11112> 
       <Dates> 
        <StartDate>2014-05-29</StartDate> 
        <EndDate>2014-05-29</EndDate> 
       </Dates> 
       </RecordB11112> 
       <RecordB11112> 
       <Dates> 
        <StartDate>2014-05-21</StartDate> 
        <EndDate>2014-05-21</EndDate> 
       </Dates> 
       </RecordB11112> 
      </RecordB1111> 
      </RecordB111> 
     </RecordB11> 
     </RecordB1> 
    </RecordB> 
    </Example> 
    <Example> 
    <RecordA> 
     <RecordA1> 
     <RecordA11> 
      <ElementA11></ElementA11> 
     </RecordA11> 
     </RecordA1> 
     <RecordA2> 
     <ElementA2></ElementA2> 
     </RecordA2> 
    </RecordA> 
    <RecordB> 
     <RecordB1> 
     <ElementB1></ElementB1> 
     <RecordB11> 
      <ElementB11></ElementB11> 
      <RecordB111> 
      <RecordB1111> 
       <RecordB11111> 
       <ElementB11111></ElementB11111> 
       </RecordB11111> 
       <ElementB1111></ElementB1111> 
       <RecordB11112> 
       <Dates> 
        <StartDate>2014-04-09</StartDate> 
        <EndDate>2014-04-09</EndDate> 
       </Dates> 
       </RecordB11112> 
      </RecordB1111> 
      </RecordB111> 
     </RecordB11> 
     </RecordB1> 
    </RecordB> 
    </Example> 
    <Example> 
    <RecordA> 
     <RecordA1> 
     <RecordA11> 
      <ElementA11></ElementA11> 
     </RecordA11> 
     </RecordA1> 
     <RecordA2> 
     <ElementA2></ElementA2> 
     </RecordA2> 
    </RecordA> 
    <RecordB> 
     <RecordB1> 
     <ElementB1></ElementB1> 
     <RecordB11> 
      <ElementB11></ElementB11> 
      <RecordB111> 
      <RecordB1111> 
       <RecordB11111> 
       <ElementB11111></ElementB11111> 
       </RecordB11111> 
       <ElementB1111></ElementB1111> 
       <RecordB11112> 
       <Dates> 
        <StartDate>2014-06-02</StartDate> 
        <EndDate>2014-06-02</EndDate> 
       </Dates> 
       </RecordB11112> 
       <RecordB11112> 
       <Dates> 
        <StartDate>2014-06-05</StartDate> 
        <EndDate>2014-06-05</EndDate> 
       </Dates> 
       </RecordB11112> 
      </RecordB1111> 
      </RecordB111> 
     </RecordB11> 
     </RecordB1> 
    </RecordB> 
    </Example> 
</Examples> 
+0

Вы хотите создать несколько документов с результатами XSLT 1.0? Или почему вы говорите: «Я хочу разбить XmlDocument на массив XmlDocuments»? Большинство процессоров XSLT 1.0 не поддерживают расширение для создания нескольких элементов результата, а 'xsl: result-document' - это функция XSLT 2.0 или более поздняя. –

+0

Также я не вижу разницы между размещенным входом и желаемым выходом. –

+0

К сожалению, я виноват, я обновил желаемый результат. –

ответ

0

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

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

<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="group" match="RecordB11112" use="substring(Dates/StartDate, 1, 7)"/> 

<xsl:template match="/"> 
    <Examples> 
    <xsl:apply-templates select="//RecordB11112[generate-id() = generate-id(key('group', substring(Dates/StartDate, 1, 7))[1])]"/> 
    </Examples> 
</xsl:template> 

<xsl:template match="RecordB11112"> 
    <xsl:variable name="to-be-copied" select="key('group', substring(Dates/StartDate, 1, 7))"/> 
    <xsl:apply-templates select="/*" mode="recreate"> 
    <xsl:with-param name="to-be-copied" select="$to-be-copied"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="@* | node()" mode="recreate"> 
    <xsl:param name="to-be-copied"/> 
    <xsl:copy> 
    <xsl:apply-templates select="@*" mode="recreate"/> 
    <xsl:apply-templates mode="recreate"> 
     <xsl:with-param name="to-be-copied" select="$to-be-copied"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="RecordB11112" mode="recreate"> 
    <xsl:param name="to-be-copied"/> 
    <xsl:if test="$to-be-copied[generate-id() = generate-id(current())]"> 
    <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
+0

Thxs, вот что я искал, я уже пытался с Muenchian grouping, но не смог скопировать исходную родительскую структуру. –

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