удалить дублирующийся родительский тег на основе значения дочерних атрибутов в XML с помощью XSLT - PullRequest
0 голосов
/ 02 июля 2019

У меня ниже XML-файл, в котором мне нужно удалить тег ExemptionList на основе значения атрибута дочернего тега. Значение атрибута дочернего тега, если значение атрибута дочернего тега такое же, необходимо удалить дублирующиеся теги parent-child.

Входной XML:

 <MaterialInfo>
        <ExemptionList>
          <ExemptionListID authority="IPC" identity="EL2011/534/EU"/>
          <Exemption description="Lead in high melting temperature" identity="7(a)"/>
        </ExemptionList>
        <ExemptionList>
          <ExemptionListID authority="IPC" identity="EL2011/534/EU"/>
          <Exemption description="Lead in high melting temperature" identity="7(a)"/>
        </ExemptionList>
</MaterialInfo>

Ожидаемый выходной XML:

<MaterialInfo>
        <ExemptionList>
          <ExemptionListID authority="IPC" identity="EL2011/534/EU"/>
          <Exemption description="Lead in high melting temperature" identity="7(a)"/>
        </ExemptionList>
</MaterialInfo>

Требуется решение на основе преобразования XSLT v2.0.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Похоже, вы хотите сгруппировать элементы ExemptionList по значению атрибута identity дочернего элемента Exemption:

  <xsl:template match="MaterialInfo">
      <xsl:copy>
          <xsl:for-each-group select="ExemptionList" group-by="Exemption/@identity">
              <xsl:apply-templates select="."/>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty -development.net/ 6r5Gh3Y имеет пример XSLT 3, но для процессора XSLT 2 вам просто нужно заменить объявление xsl:mode, используемое там шаблоном преобразования идентификаторов

<xsl:template match="@* | node()">
   <xsl:copy>
     <xsl:apply-templates select="@* , node()"/>
   </xsl:copy>
</xsl:template>
0 голосов
/ 02 июля 2019

Вы хотите что-то вроде

<xsl:template match="MaterialInfo">
  <xsl:for-each-group select="*" group-by="@identity">
    <xsl:apply-templates select="current-group()[1]"/>
  </xsl:for-each-group>
<xsl:template>

Предполагается, что равного @identity достаточно, чтобы идентифицировать два элемента как дубликаты.

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