Сортировка XML по содержимому подузла - PullRequest
1 голос
/ 30 апреля 2020

У меня есть XML документ со следующей структурой

<movements status="1">
    <movement>
        <article>49-000003</article>
        <lot>0I0311</lot>
        <type>4</type>
        <date></date>
    </movement>
    <movement>
        <article>49-000013</article>
        <lot>0I0312</lot>
        <type>4</type>
        <date></date>
    </movement>
    <movement>
        <article>49-000001</article>
        <lot>0I0313</lot>
        <type>4</type>
        <date></date>
    </movement>
</movements>

Как я могу (используя xmllint) отсортировать его так, чтобы узлы перемещения были упорядочены по статье?

Мне нужно вывод будет другим XML файлом.

Ответы [ 2 ]

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

Попробуйте что-нибудь подобное на iMa c и посмотрите, работает ли оно:

xidel  your_file.xml --xquery 'for $node in //movement order by $node/article return $node' --output-format xml
0 голосов
/ 30 апреля 2020

Если вы можете использовать xmlstarlet (tr команда ), простой XSLT должен работать ...

XSLT 1.0 ( test.xsl)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

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

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

</xsl:stylesheet>

Командная строка

xmlstarlet tr test.xsl input.xml > output.xml

Вывод (вывод. xml)

<movements status="1">
   <movement>
      <article>49-000001</article>
      <date/>
      <lot>0I0313</lot>
      <type>4</type>
   </movement>
   <movement>
      <article>49-000003</article>
      <date/>
      <lot>0I0311</lot>
      <type>4</type>
   </movement>
   <movement>
      <article>49-000013</article>
      <date/>
      <lot>0I0312</lot>
      <type>4</type>
   </movement>
</movements>
...