Мне нужно сгруппировать значение на основе некоторого атрибута и заполнить его

102
12

Мне нужно сгруппировать значение на основе некоторого атрибута и заполнить его.

Входной XML ниже, а дубликат jobid определяется как разделитель (|).

При генерации фактического o/p мне нужно группировать по заданию и генерировать порядковый номер для дубликатов заданий. Как мне это сделать?

  <employes>
<job>
<jobid>125</jobid>
</job>
<job>
<jobid>1011</jobid>
</job>
<job>
<jobid>123|1</jobid>
</job>
<job>
<jobid>123|2</jobid>
</job>
<job>
<jobid>1010</jobid>
</job>
<job>
<jobid>123|1</jobid>
</job>
</employes>

Ожидаемый результат: мне нужно группировать значения на основе разделения и заполнения

<employes>
<job>
<jobnum>1</jobnum>
<jobid>123</jobid>
</job>
<job>
<jobnum>2</jobnum>
<jobid>123</jobid>
</job>
<job>
<jobnum>3</jobnum>
<jobid>123</jobid>
</job>
<job>
<jobid>125</jobid>
</job>
<job>
<jobid>1010</jobid>
</job>
<job>
<jobid>1011</jobid>
</job>
</employes>

спросил(а) 2015-07-21T17:46:00+03:00 4 года, 11 месяцев назад
1
Решение
66

Поскольку вы используете XSLT 2.0 (вопрос был первоначально помечен только XSLT 2.0), вы должны иметь возможность использовать xsl:for-each-group и группы по числу до | в jobid...

Вход XML

<employes>
<job>
<jobid>125</jobid>
</job>
<job>
<jobid>1011</jobid>
</job>
<job>
<jobid>123|1</jobid>
</job>
<job>
<jobid>123|2</jobid>
</job>
<job>
<jobid>1010</jobid>
</job>
<job>
<jobid>123|1</jobid>
</job>
</employes>

XSLT 2.0

<xsl:stylesheet version="2.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="@*"/>
<xsl:for-each-group select="job" group-by="substring-before(concat(jobid,'|'),'|')">
<xsl:sort select="substring-before(concat(jobid,'|'),'|')" data-type="number" order="ascending"/>
<xsl:apply-templates select="current-group()"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>

<xsl:template match="job[contains(jobid,'|')]">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(self::jobid)]"/>
<jobnbr><xsl:value-of select="position()"/></jobnbr>
<jobid><xsl:value-of select="substring-before(jobid,'|')"/></jobid>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

Выход XML

<employes>
<job>
<jobnbr>1</jobnbr>
<jobid>123</jobid>
</job>
<job>
<jobnbr>2</jobnbr>
<jobid>123</jobid>
</job>
<job>
<jobnbr>3</jobnbr>
<jobid>123</jobid>
</job>
<job>
<jobid>125</jobid>
</job>
<job>
<jobid>1010</jobid>
</job>
<job>
<jobid>1011</jobid>
</job>
</employes>

ответил(а) 2015-07-21T20:33:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема