2 votes

XSLT : passage du format des éléments au format des attributs

Quel serait le XSLT pour modifier ce XML ?

<?xml version="1.0" encoding="utf-8"?>
<cas:ADDRESS_DETAILS PRIMARY_ADDRESS_INDICATOR="1" ADDRESS_ID="-289495914026885120" ADDRESS_TYPE="45001" ADDRESS_ACTIVE_FROM_DATE="2006-12-23" PERSON_ID="14512823342202880">
   <cas:ADDRESS_ELEMENT VALUE="McMurchy Avenue" TYPE="ADD2" />
   <cas:ADDRESS_ELEMENT VALUE="ON" TYPE="PROV" />
   <cas:ADDRESS_ELEMENT VALUE="CA" TYPE="COUNTRY" />
   <cas:ADDRESS_ELEMENT VALUE="Brampton" TYPE="CITY" />
   <cas:ADDRESS_ELEMENT VALUE="440" TYPE="ADD1" />
</cas:ADDRESS_DETAILS>

Dans ce format

<?xml version="1.0" encoding="utf-8"?>
<cas:ADDRESS_DETAILS PRIMARY_ADDRESS_INDICATOR="1" ADDRESS_ID="-289495914026885120" ADDRESS_TYPE="45001" ADDRESS_ACTIVE_FROM_DATE="2006-12-23" PERSON_ID="14512823342202880" ADD2 ="McMurchy" PROV="ON" COUNTRY="CA" CITY="Brampton" ADD1="440">
</cas:ADDRESS_DETAILS>

2voto

Martin Honnen Points 46896

En supposant que vous souhaitiez fusionner tous les ADDRESS_ELEMENT à l'intérieur de leur parent, vous pouvez utiliser

  <xsl:template match="ADDRESS_ELEMENT[1]">
      <xsl:copy>
          <xsl:apply-templates select="../ADDRESS_ELEMENT" mode="to-attribute"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="ADDRESS_ELEMENT[position() > 1]"/>

  <xsl:template match="ADDRESS_ELEMENT" mode="to-attribute">
      <xsl:attribute name="{@TYPE}" select="@VALUE"/>
  </xsl:template>

plus la transformation d'identité pour traiter le reste (c'est-à-dire <xsl:mode on-no-match="shallow-copy"/> dans XSLT 3 ( https://xsltfiddle.liberty-development.net/6qM2e2q ) ou le modèle correspondant dans les versions antérieures)

Si vous souhaitez transformer les éléments enfants en attributs du parent, comme votre modification semble l'indiquer, vous pouvez simplifier le code. L'utilisation d'un espace de noms nécessite toutefois quelques adaptations :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xpath-default-namespace="http://example.com/cas"
    version="3.0">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="ADDRESS_DETAILS">
      <xsl:copy>
          <xsl:apply-templates select="@*, ADDRESS_ELEMENT"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="ADDRESS_ELEMENT">
      <xsl:attribute name="{@TYPE}" select="@VALUE"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6qM2e2q/2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X