XSLT для сортировки элементов определенных тегов XML на основе атрибута элементов - PullRequest
0 голосов
/ 16 января 2019

Хотите преобразовать (отсортировать) "элементы конкретного тега"

Я новичок в XSLT. следовательно, требуется понять, как XSLT может обрабатывать определенный тег.

Текущий XML

<root>
    <tag>bla bla bla</tag>
    <tag>foo foo foo</tag>
    <tag>
         <particular-tag>
               <element attrib="2"/>
               <element attrib="3"/>
               <element attrib="4"/>
               <element attrib="1"/>
         </particular-tag>
         <particular-tag>
               <element attrib="5"/>
               <element attrib="3"/>
               <element attrib="4"/>
         </particular-tag>
    </tag>
</root>

Желаемый XML

<root>
    <tag>bla bla bla</tag>
    <tag>foo foo foo</tag>
    <tag>
         <particular-tag>
               <element attrib="1"/>
               <element attrib="2"/>
               <element attrib="3"/>
               <element attrib="4"/>
         </particular-tag>
         <particular-tag>
               <element attrib="3"/>
               <element attrib="4"/>
               <element attrib="5"/>
         </particular-tag>
    </tag>
</root>

Заранее спасибо. Вы можете предложить мне источник онлайн-обучения, где я могу поиграть с XML-XLST.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Это должно дать результаты, которые вы ищете.Надеюсь, это поможет.

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

  <xsl:template match="particular-tag">
    <particular-tag>
      <xsl:apply-templates select="element">
        <xsl:sort select="@attrib"/>
      </xsl:apply-templates>
    </particular-tag>
  </xsl:template>

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

</xsl:stylesheet>
0 голосов
/ 16 января 2019

Этот XSLT даст желаемый результат:

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

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

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