XPath 1.0: перемещение первого элемента в наборе узлов на последнюю позицию - PullRequest
0 голосов
/ 24 апреля 2018

С учетом XML-документа

<items>
 <item><key></key><value>empty</value></item>
 <item><key>A</key><value>foo</value></item>
 <item><key>C</key><value>data</value></item>
 <item><key>B</key><value>bar</value></item>
</items>

Учитывая набор узлов / items / item, я хочу переместить первый элемент в последнюю позицию, оставив все остальные элементы в той же позиции.

Неиспользуемые подходы:

  • | оператор объединения хранит порядок документов.
  • <xsl:sort> Я только хочу переместить элемент, но не сортировать весь список элементов.

Ожидаемый результат:

<items>
 <item><key>A</key><value>foo</value></item>
 <item><key>C</key><value>data</value></item>
 <item><key>B</key><value>bar</value></item>
 <item><key></key><value>empty</value></item>
</items>

Примечание: перемещаемый элемент можно определить по первой позиции или пустому ключу (если это полезно).

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Это может вам помочь.

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

<xsl:template match="items">
  <xsl:copy>
    <!-- Output attributes, if any. -->
    <xsl:apply-templates select="@*"/>
    <!-- Out item(s) that are not first. -->
    <xsl:apply-templates select="item[position() != 1]"/>
    <!-- Output the first item. -->
    <xsl:apply-templates select="item[position() = 1]"/>
  </xsl:copy>
</xsl:template>
0 голосов
/ 24 апреля 2018

Один из подходов заключается в использовании следующего шаблона в сочетании с шаблоном идентификации :

<xsl:template match="item[1]">                     <!-- matches the first item element -->
    <xsl:copy-of select="following-sibling::*"/>   <!-- copies all but the first element -->
    <xsl:copy-of select="."/>                      <!-- copies the current/first element -->
</xsl:template>

Вывод:

<item>
    <key>A</key>
    <value>foo</value>
</item>
<item>
    <key>C</key>
    <value>data</value>
</item>
<item>
    <key>B</key>
    <value>bar</value>
</item>
<item>
    <key/>
    <value>empty</value>
</item>

Добавление шаблона идентификации окружает его элементом items для получения полного желаемого результата.

...