#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? — Если вы хотите сохранить существующие неотрицательные числа, как насчет замены отрицательных чисел числами, которые выше максимального?