XSLT: смешивать узлы, если они имеют одинаковый идентификатор - PullRequest
0 голосов
/ 18 октября 2019

У меня есть XML с похожей структурой:

<Info>
<parents>
    <parent1>
        <id>1</id>
    </parent1>
    <parent2>
        <id>2</id>
    </parent2>
</parents>

<children>

    <child>
        <id>1</id>
        <parentID>
            1
        </parentID>
        <someInfoFromOneNode>
            qqq
        </someInfoFromOneNode>
    </child>
    <child>
        <id>1</id>
        <parentID>
            1
        </parentID>
        <someInfoFromAnOtherNode>
            qqq
        </someInfoFromAnOtherNode>
    </child>
    <child>
        <id>2</id>
        <parentID>
            2
        </parentID>
        <someInfoFromOneNode>
            qqq
        </someInfoFromOneNode>
    </child>
    <child>
        <id>2</id>
        <parentID>
            2
        </parentID>
        <someInfoFromAnOtherNode>
            qqq
        </someInfoFromAnOtherNode>
    </child>
</children>
</Info>

Мне нужно получить XML с этой структурой:

<Info>

<parent>
    <id>1</id>
    <children>
        <chidl>
            <id>1</id>
            <someInfoFromOneNode>
                 qqq
            </someInfoFromOneNode>
            <someInfoFromAnOtherNode>
                  qqq
            </someInfoFromAnOtherNode>
        </chidl>
    </children>
</parent>
<parent>
    <id>2</id>
    <children>
        <chidl>
            <id>2</id>
             <someInfoFromOneNode>
                 qqq
            </someInfoFromOneNode>
            <someInfoFromAnOtherNode>
                  qqq
            </someInfoFromAnOtherNode>
        </chidl>
    </children>
</parent>

</Info>

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

<children>
          <xsl:for-each select="/Info/children/child">
                  <xsl:if test="./price_groups_id = $parentId and not(./id = preceding-sibling::id)">
                          <child>
                              <id>
                                 <xsl:value-of select="./id"/>

                               </id
                          </child>
                   </xsl:if>
           </xsl:for-each>

 </children>

Но он фильтрует только дочерние идентификаторы по родительскому идентификатору и дублирует их, поэтому текущий результат таков:

    <Info>

<parent>
    <id>1</id>
    <children>
        <child>
            <id>1</id>
        </child>
        <child>
            <id>1</id>
        </child>
    </children>
</parent>
<parent>
    <id>2</id>
    <children>
        <child>
            <id>2</id>
        </child>
        <child>
            <id>2</id>
        </child>
    </children>
</parent>

</Info>

Что я могу сделать, чтобы проверить идентификатор предыдущего узла и выполнить фильтрацию по нему?

...