XSL 1.0 Заменить значение, а затем удалить дубликаты из переменной xml - PullRequest
0 голосов
/ 08 ноября 2018

Извините, если это повторяется, но я изо всех сил пытаюсь решить это. У меня есть переменная xml. У меня есть переменная xsl, которая имеет XML как это:

<root>
    <data>
        <GroupItems>
            <row id="30" class="A100"/>

            <row id="50" class="B100"/>

            <row id="100" class="A100"/>

            <row id="20" class="C100"/>

        </GroupItems>
    </data>
</root>

Я должен заменить значение "id" из предыдущего узла-брата на основе значения "class". Дубликат предыдущего класса = "A100" должен быть удален, но значение "id" должно быть скопировано в первый узел вхождения. В этом случае требуется вывод:

<root>
    <data>
        <GroupItems>
            <row id="100" class="A100"/>

            <row id="50" class="B100"/>

            <row id="20" class="C100"/>

        </GroupItems>
    </data>
</root>

Приведенный ниже код удаляет дубликаты из строки, но мне нужно заменить значение id (id = "100").

 <xsl:for-each select="CSharp:NodeList($RawInstruction1)//GroupItems/row[(@class = preceding-sibling::row/@class)]">

1 Ответ

0 голосов
/ 08 ноября 2018

Начните с шаблона преобразования идентификаторов, а затем добавьте ключ для «группировки» элементов row по атрибуту class, затем добавьте шаблоны для копирования атрибута id из последнего row в каждой группе. к первому и другому шаблону для подавления копирования оставшихся дублированных row с в группе:

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

    version="1.0">

  <xsl:output method="xml"/>

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

  <xsl:key name="class-group" match="GroupItems/row" use="@class"/>

  <xsl:template match="GroupItems/row[generate-id() = generate-id(key('class-group', @class)[1])]/@id">
      <xsl:copy-of select="key('class-group', ../@class)[last()]/@id"/>
  </xsl:template>

  <xsl:template match="GroupItems/row[not(generate-id() = generate-id(key('class-group', @class)[1]))]"/>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / nc4NzRn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...