Сортировка внутренних тегов по вложенным XML с использованием XSLT - PullRequest
0 голосов
/ 23 апреля 2020

My XML:

<List>
    <Item name="B" name2="cyprus">
        <ItemID value="ID_B"/>
        <InnerList>
            <InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
            <InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
        </InnerList>
    </Item>
    <Item name="B" name2="alele">
        <ItemID value="ID_B"/>
        <InnerList>
            <InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
            <InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
        </InnerList>
    </Item>
    <Item name="A" name2="alele">
        <ItemID value="ID_A"/>
        <InnerList>
            <InnerItem description="basic"><more_nested_data></more_nested_data></InnerItem>
            <InnerItem description="algarve"><more_nested_data></more_nested_data></InnerItem>
        </InnerList>
    </Item>
</List>

Я хочу отсортировать по Item.name, Item.name2. Я также хочу отсортировать InnerItem в InnerList по атрибуту description.

Желаемый результат:

<List>
<Item name="A" name2="alele">
    <ItemID value="ID_A"/>
    <InnerList>
        <InnerItem description="algarve"><more_nested_data></more_nested_data></InnerItem>
        <InnerItem description="basic"><more_nested_data></more_nested_data></InnerItem>        
    </InnerList>
</Item>
<Item name="B" name2="alele">
    <ItemID value="ID_B"/>
    <InnerList>
        <InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
        <InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>        
    </InnerList>
</Item>
<Item name="B" name2="cyprus">
    <ItemID value="ID_B"/>
    <InnerList>
        <InnerItem description="c#"><more_nested_data></more_nested_data></InnerItem>
        <InnerItem description="porto"><more_nested_data></more_nested_data></InnerItem>
    </InnerList>
</Item>
</List>

Мой XSL:

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

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

      <xsl:template match="List">
    <xsl:copy>
      <xsl:apply-templates select="Item">
        <xsl:sort select="@name"/>
        <xsl:sort select="@name2"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Это делает закажите Item правильно. Как мне go о сортировке InnerItem?

Я мог бы добавить это for-each:

 <xsl:template match="List">
    <xsl:for-each select="Item">
        <xsl:for-each select="InnerList">
            <xsl:for-each select="InnerItem">
                <xsl:sort select="@description"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

, но потом я потерял свою структуру XML и получил:

<InnerItem description="c#">
  <more_nested_data/>
</InnerItem><InnerItem description="porto">
  <more_nested_data/>
</InnerItem><InnerItem description="c#">
  <more_nested_data/>
</InnerItem><InnerItem description="porto">
  <more_nested_data/>
</InnerItem><InnerItem description="algarve">
  <more_nested_data/>
</InnerItem><InnerItem description="basic">
  <more_nested_data/>
</InnerItem>

Любой намек, какой правильный подход приветствуется.

1 Ответ

1 голос
/ 23 апреля 2020

Просто добавьте еще один шаблон:

<xsl:template match="InnerList">
    <xsl:copy>
        <xsl:apply-templates select="InnerItem">
            <xsl:sort select="@description"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...