XSL сортировка и номер - PullRequest
       2

XSL сортировка и номер

0 голосов
/ 11 июня 2018

Я никогда раньше не использовал XSL, поэтому уверен, что на этот вопрос есть простой ответ, но у меня проблемы.Я пытаюсь взять свой ввод и вывести нумерованный список элементов, но я пытаюсь отсортировать элементы перед их нумерацией.Я либо получаю нумерацию без сортировки, либо сортировка работает, но нумерация вышла из строя.Я сделал некоторое копирование / вставку, но для краткости удалил изрядное количество контента, я думаю, что все соответствующие части есть.

<workitem id="9421" type="Feature" state="Development">     
    <System.Id>9421</System.Id>
    <System.WorkItemType>Feature</System.WorkItemType>
    <workitem id="9404" type="Bug" state="Development">
        <System.Id>9404</System.Id>
        <System.WorkItemType>Bug</System.WorkItemType>
    </workitem>
    <workitem id="9422" type="User Story" state="Development">
        <System.Id>9422</System.Id>
        <System.WorkItemType>User Story</System.WorkItemType>
    </workitem>
    <workitem id="9423" type="User Story" state="Development">
        <System.Id>9423</System.Id>
        <System.WorkItemType>User Story</System.WorkItemType>
    </workitem>
    <workitem id="9424" type="User Story" state="Development">
        <System.Id>9424</System.Id>
        <System.WorkItemType>User Story</System.WorkItemType>
    </workitem>
    <workitem id="9431" type="Bug" state="Development">
        <System.Id>9431</System.Id>
        <System.WorkItemType>Bug</System.WorkItemType>
    </workitem>
</workitem>

А вот пример xsl, относящийся к этой части:

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

<xsl:template match="/">
  <xsl:apply-templates select="/result /workitem" />
</xsl:template>
<xsl:template match="workitem[@type='Feature']">
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <xsl:element name="h{$level}">
      <xsl:attribute name="class">
          <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
      </xsl:attribute>
    <xsl:number level="multiple" format="1. "/>
    <xsl:value-of select="System.WorkItemType" />
     #<xsl:value-of select="System.Id" />
  </xsl:element >
  <xsl:apply-templates select="workitem">
      <xsl:sort select="@type" />
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="workitem[@type='Bug']">
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <xsl:element name="h{$level}">
    <xsl:attribute name="class">
      <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
    </xsl:attribute>
    <xsl:number level="multiple" format="1. "/>
    <xsl:value-of select="System.WorkItemType" />
    #<xsl:value-of select="System.Id" />
  </xsl:element >
</xsl:template>

<xsl:template match="workitem[@type='User Story']">
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <xsl:element name="h{$level}">
    <xsl:attribute name="class">
      <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
    </xsl:attribute>
    <xsl:number level="multiple" format="1. "/>
    <xsl:value-of select="System.WorkItemType" />
    #<xsl:value-of select="System.Id" />
  </xsl:element >
</xsl:template>
</xsl:stylesheet>

Вывод, который я получаю, это:

  1. Feature # 9421
    1.1.Ошибка № 9404
    1,5.Ошибка # 9431
    1.2.История пользователя # 9422
    1.3.История пользователя # 9423
    1.4.User Story # 9424

Что я хочу:

  1. Feature # 9421
    1.1.Ошибка # 9404
    1.2.Ошибка # 9431
    1.3.История пользователя # 9422
    1.4.История пользователя # 9423
    1.5.User Story # 9424

Буду признателен за любые мудрые слова.

1 Ответ

0 голосов
/ 11 июня 2018

xsl:number вернет позицию текущего элемента во входном XML независимо от того, как вы его выбрали или пытаетесь отсортировать.Если вы хотите найти позицию после сортировки, вы должны использовать position()

<xsl:value-of select="concat(position(), '. ')" />

Однако вам придется немного проделать дополнительную работу во втором шаблоне, поскольку вам нужно будет передать вположение родителя workItem в качестве параметра, позволяющего получить полный номер

Попробуйте это XSLT

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

<xsl:template match="/">
  <xsl:apply-templates select="/result/workitem">
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="workitem[@type='Feature']">
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <xsl:element name="h{$level}">
      <xsl:attribute name="class">
          <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
      </xsl:attribute>
    <xsl:value-of select="concat(position(), '. ')" />
    <xsl:value-of select="System.WorkItemType" />
     #<xsl:value-of select="System.Id" />
  </xsl:element>

  <xsl:apply-templates select="workitem">
      <xsl:with-param name="parentPos" select="position()" />
      <xsl:sort select="@type" />
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="workitem[@type='Bug' or @type='User Story']">
  <xsl:param name="parentPos"/>
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <xsl:element name="h{$level}">
    <xsl:attribute name="class">
      <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
    </xsl:attribute>
    <xsl:value-of select="concat($parentPos, '.', position(), '. ')" />
    <xsl:value-of select="System.WorkItemType" />
    #<xsl:value-of select="System.Id" />
  </xsl:element>
</xsl:template>
</xsl:stylesheet>

Однако вы можете знать, что вы можете выполнить автоматическую нумерациюсписок дочерних элементов с использованием счетчиков CSS, а не пытаться сделать это в XSLT.

Попробуйте это тоже

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

<xsl:template match="/">
  <html>
    <head>
      <style>
ol {
    counter-reset: section;
    list-style-type: none;
}

li:before {
    counter-increment: section;
    content: counters(section, ".") ". ";
}

h1, h2, h3 {
    display:inline;
}
      </style>
    </head>
    <body>
      <xsl:apply-templates select="/result/workitem" />
    </body>      
  </html>
</xsl:template>

<xsl:template match="workitem[@type='Feature']">
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <ol>
    <li>
      <xsl:element name="h{$level}">
        <xsl:attribute name="class">
          <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
        </xsl:attribute>
        <xsl:value-of select="System.WorkItemType" /> #<xsl:value-of select="System.Id" />
      </xsl:element>
      <ol>
        <xsl:apply-templates select="workitem">
          <xsl:sort select="@type" />
        </xsl:apply-templates>
      </ol>
    </li>
  </ol>
</xsl:template>

<xsl:template match="workitem[@type='Bug' or @type='User Story']">
  <xsl:variable name="level" select="count(ancestor-or-self::*) "/>
  <li>
    <xsl:element name="h{$level}">
      <xsl:attribute name="class">
        <xsl:value-of select="translate(System.WorkItemType,' ','')"/>
      </xsl:attribute>
      <xsl:value-of select="System.WorkItemType" />  #<xsl:value-of select="System.Id" />
    </xsl:element>
  </li>
</xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...