Xslt: переписать дерево для сортировки дочерних атрибутов по разным родителям перед использованием данных - PullRequest
0 голосов
/ 08 мая 2018

Я спотыкаюсь на шаге от того, что я хочу сделать:

Что у меня есть:

    <cat>
        <cat2>
             <item name="ddd">...</item>
        </cat2>
        <cat3>
             <cat4>
                  <cat5>
                          <item name="aaa">...</item>
                          <item name="fff">...</item>
                  </cat5>
                  <item name="bbb">...</item>
             </cat4>
             <item name="eee">...</item>
        </cat3>
        <item name="ccc">...</item>
    </cat>

И я хотел бы отсортировать его по названию элемента (для экспорта), поэтому со всеми словами "cat", переписанными для сортировки, например:

 <cat>
    <cat3>
         <cat4>
              <cat5>
                      <item name="aaa">...</item>
              </cat5>
              <item name="bbb">...</item>
         </cat4>
    </cat3>
    <item name="ccc">...</item>
    <cat2>
         <item name="ddd">...</item>
    </cat2>
    <cat3>
         <item name="eee">...</item>
         <cat4>
              <cat5>
                      <item name="fff">...</item>
              </cat5>
         </cat4>
    </cat3>
</cat>

Мне все равно, если результат будет длинным, потому что я буду экспортировать его в (... | itemName | cat | cat1 | cat2 | ...) Но я должен сохранить родителей для каждого и получить их по порядку имя, потому что сортировка после экспорта совершенно невозможна.

1 Ответ

0 голосов
/ 09 мая 2018

XSLT 3 имеет функцию snapshot, которая позволяет вам легко создавать копию узла и его предков, используя XSLT 3 (как доступно в версии с открытым исходным кодом Saxon 9.8 HE для .NET и Java и C / C ++) Вы могли бы по крайней мере легко упорядочить элементы item по имени, а затем воссоздать иерархию предков для каждого элемента в отдельности:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/*">
      <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:variable name="sorted-items" as="element(item)*">
              <xsl:perform-sort select="descendant::item">
                  <xsl:sort select="@name"/>
              </xsl:perform-sort>
          </xsl:variable>
          <xsl:sequence select="$sorted-items!root(snapshot())"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Результат для вашего образца

<cat>
   <cat>
      <cat3>
         <cat4>
            <cat5>
               <item name="aaa">...</item>
            </cat5>
         </cat4>
      </cat3>
   </cat>
   <cat>
      <cat3>
         <cat4>
            <item name="bbb">...</item>
         </cat4>
      </cat3>
   </cat>
   <cat>
      <item name="ccc">...</item>
   </cat>
   <cat>
      <cat2>
         <item name="ddd">...</item>
      </cat2>
   </cat>
   <cat>
      <cat3>
         <item name="eee">...</item>
      </cat3>
   </cat>
   <cat>
      <cat3>
         <cat4>
            <cat5>
               <item name="fff">...</item>
            </cat5>
         </cat4>
      </cat3>
   </cat>
</cat>

, что может быть достаточно, если для экспорта нужны только предки каждого элемента, а сохранение структуры родного брата не имеет значения.

Онлайн-образец: https://xsltfiddle.liberty -development.net / bFDb2C2 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...