Заполните пропущенные числа в последовательности в XSLT

#xml #xslt-1.0

#xml #xslt-1.0

Вопрос:

У меня есть исходный XML-файл, который содержит тесты и их результаты, а также индексы для этих тестов. Формат ввода выглядит примерно так:

Исходный XML:

 <Test>
  <Name>Test1</Name>
  <Results>
    <Item>
      <Name>Result1</Name>
      <Row>0</Row>
      <Col>0</Col>
    </Item>
    <Item>
      <Name>Result2</Name>
      <Row>0</Row>
      <Col>-1</Col>
    </Item>
    <Item>
      <Name>Result3</Name>
      <Row>0</Row>
      <Col>-1</Col>
    </Item>
    <Item>
      <Name>Result4</Name>
      <Row>0</Row>
      <Col>2</Col>
    </Item>
  </Results>
</Test>
  

Я хочу иметь ту же структуру, что и раньше, но каждый индекс (будь то строка или столбец), который равен -1, должен автоматически увеличиваться, начиная с 0. Не должно быть дубликатов, поэтому Result2 не должен получать 0 для своего столбца, а 1, а Result3 должен иметь значение столбца 3. ‘-1’ — это форма указания динамических индексов, которые не определены заранее, а скорее после некоторых других преобразований (которые будут выполнены до того, как я захочу изменить последовательность индексов).
Сортировка будет выполнена позже, в соответствии с индексами (в именах обычно нет цифр).

Я пробовал работать с position() или keys, но не смог найти способ использовать их таким образом, чтобы решить мою проблему. Прямо сейчас у меня есть только преобразование, которое считается вверх, без учета любого другого существующего индекса с тем же значением.

XSLT:

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

<xsl:template match="Results">
  <xsl:for-each select="Item/Col">
    <xsl:choose>
      <xsl:when test="Item/Col = -1">
        <xsl:value-of select="position()-1"/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:value-of select="Item/Col"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</xsl:template>
  

Желаемый результат:

 <Test>
  <Name>Test1</Name>
  <Results>
    <Item>
      <Name>Result1</Name>
      <Row>0</Row>
      <Col>0</Col>
    </Item>
    <Item>
      <Name>Result2</Name>
      <Row>0</Row>
      <Col>1</Col>
    </Item>
    <Item>
      <Name>Result4</Name>
      <Row>0</Row>
      <Col>2</Col>
    </Item>
    <Item>
      <Name>Result3</Name>
      <Row>0</Row>
      <Col>3</Col>
    </Item>
  </Results>
</Test>
  

Сам источник не имеет дубликатов, возможны только несколько индексов ‘-1’. Выходные данные не должны содержать дубликатов, а также не более -1 для его индексов.

Итак, теперь вопрос в том, как я могу заполнить числовую последовательность, не добавляя к ней никаких дубликатов?

Комментарии:

1. Вопрос не ясен. Действительно ли ваш источник имеет повторяющиеся индексы? Пожалуйста, укажите желаемый результат и убедитесь, что мы понимаем, почему результат такой, какой он есть.

2. Хорошо, я добавил желаемый результат. Индексы -1 являются только заполнителями и предназначены для замены индексами, которые равны 0 или больше, без замены, равной любому уже существующему индексу. Я надеюсь, что это прояснит мой вопрос.

3. Я боюсь, что логика все еще ускользает от меня. Вам кажется, что вы просто перенумеровали столбцы последовательно, начиная с 0? — Если вы хотите сохранить существующие неотрицательные числа, как насчет замены отрицательных чисел числами, которые выше максимального?