Nano Hash - криптовалюты, майнинг, программирование

Удаление дубликатов из пакета, возвращаемого xsl:key, на основе значения атрибута

У меня есть следующий xml-файл.

<Bank>
  <Person personId="1" type="1071" deleted="0">
  </Person>
  <Person personId="2" type="1071" deleted="0">
  </Person>
  <Person personId="3" type="1071" deleted="0">
  </Person>
  <Account>
    <Role personId="1" type="1025" />
  </Account>
  <Account>
    <Role personId="1" type="1025" />
  </Account>
  <Account>
    <Role personId="1" type="1018" />
  </Account>
  <Account>
    <Role personId="3" type="1025" />
    <Role personId="1" type="1018" />
  </Account>
  <Account>
    <Role personId="2" type="1025" />
  </Account>
</Bank>

и следующее преобразование xsl.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="ISO-8859-1" />
  <xsl:strip-space elements="*" />

  <xsl:key name="roleKey"
    match="Role[(@type = '1025' or @type = '1018' or @type = '1022' or @type = '1023') and not(@validTo)]"
    use="@personId" />

  <xsl:template match="Person">
    <xsl:value-of select="@personId" />
    <xsl:variable name="roles" select="key('roleKey', @personId)" />
    <xsl:for-each select="$roles">
      <xsl:text>;</xsl:text><xsl:value-of select="@type" />
    </xsl:for-each>
    <xsl:text>&#xA;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Фактический результат следующий, и я хотел бы удалить повторяющиеся значения type.

1;1025;1025;1018;1018
2;1025
3;1025

Ожидаемые результаты должны быть такими...

1;1025;1018
2;1025
3;1025

Я испробовал советы по ключевому слову following с этого веб-сайта, а также трюк по мюнхенскому методу. Все они не работают, поскольку они, кажется, просматривают весь документ и сопоставляют дубликаты для каждого элемента Person, тогда как я хочу удалить дубликаты только в контексте Person, определенном атрибутом personId.

Как удалить эти дубликаты из пакета, возвращаемого функцией key? Или, может быть, есть метод, который я могу использовать в xsl:for-each для печати только того, что я хочу?

Я могу использовать только то, что доступно в XSLT 1.0. У меня нет возможности использовать процессор XSLT 2.0.


Ответы:


1

Хорошо, не знаю, лучшее ли это решение, но я добился того, чего хотел, введя такой ключ и используя метод Мюнча.

<xsl:key name="typeKey" match="Role" use="concat(@type, '|', @personId)" />

Вся трансформация выглядит так после изменения...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="ISO-8859-1" />
  <xsl:strip-space elements="*" />

  <xsl:key name="roleKey"
    match="Role[(@type = '1025' or @type = '1018' or @type = '1022' or @type = '1023') and not(@validTo)]"
    use="@personId" />
  <xsl:key name="typeKey" match="Role" use="concat(@type, '|', @personId)" />

  <xsl:template match="Person">
    <xsl:value-of select="@personId" />
    <xsl:variable name="roles" select="key('roleKey', @personId)" />
    <xsl:for-each select="$roles[generate-id() = generate-id(key('typeKey', concat(@type, '|', @personId)))]">
      <xsl:text>;</xsl:text><xsl:value-of select="@type" />
    </xsl:for-each>
    <xsl:text>&#xA;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

И реальный результат сейчас...

1;1025;1018
2;1025
3;1025
21.05.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..