2 Stimmen

Generierung von XSLT zur Zuordnung von Quellwertstrukturen zu Zielfeldern in Abhängigkeit vom Quellinhalt

Ich habe eine Quellliste von Xml in diesem Format:

<metadata>
  <metadatum>
    <description>OnEnter</description>
    <value>Hello World</id>
  </metadatum>
  <metadatum>
    <description>OnLeave</description>
    <value>Goodbye World</id>
  </metadatum>
</metadata>

und eine Zielstruktur wie diese:

<friendlyText>
  <onEnter>[Content Here]</onEnter>
  <onLeave>[Content Here]</onLeave>
</friendlyText>

Ist es möglich, ein XSLT zu erstellen, das das Feld "Wert" in der Metadatenhierarchie dem richtigen Zielknoten in Abhängigkeit von der "Beschreibung" der Quelle zuordnet?

Ich versuche, dies mit Altova MapForce zu bewerkstelligen. Eigentlich sollte es dafür eine Schnittstelle geben, ich finde sie nur nicht.

1voto

InfantPro'Aravind' Punkte 11642
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" indent="yes"/>

  <xsl:template match="metadata">
    <friendlyText>
      <xsl:apply-templates select="metadatum"/>
    </friendlyText>  
  </xsl:template>

  <xsl:template match="metadatum">
    <xsl:element name="{description}">
      <xsl:value-of select="value"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Ausgabe:

<?xml version="1.0" encoding="utf-8"?>
<friendlyText>
  <OnEnter>Hello World</OnEnter>
  <OnLeave>Goodbye World</OnLeave>
</friendlyText>

0voto

Dimitre Novatchev Punkte 234995

Diese Transformation ist eine allgemeine Lösung, die mit jeder "Zielstruktur" arbeiten kann, die sich in einem separaten XML-Dokument befindet :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vUpper" select=
  "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
 <xsl:variable name="vLower" select=
  "'abcdefghijklmnopqrstuvwxyz'"/>

 <my:target>
  <friendlyText>
    <onEnter>[Content Here]</onEnter>
    <onLeave>[Content Here]</onLeave>
  </friendlyText>
 </my:target>

 <xsl:variable name="vTarget" select="document('')/*/my:target/*"/>

 <xsl:variable name="vMeta" select="/*/metadatum"/>

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

 <xsl:template match="/">
     <xsl:apply-templates select="$vTarget"/>
 </xsl:template>

 <xsl:template match="friendlyText/*/text()">
  <xsl:value-of select=
  "$vMeta[translate(description, $vLower, $vUpper)
        =
          translate(name(current()/..), $vLower, $vUpper)
          ]/value"/>
 </xsl:template>
</xsl:stylesheet>

bei Anwendung auf das bereitgestellte XML-Dokument (korrigiert, um wohlgeformt zu sein):

<metadata>
    <metadatum>
        <description>OnEnter</description>
        <value>Hello World</value>
    </metadatum>
    <metadatum>
        <description>OnLeave</description>
        <value>Goodbye World</value>
    </metadatum>
</metadata>

das gewünschte, korrekte Ergebnis liefert :

<friendlyText xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my">
   <onEnter>Hello World</onEnter>
   <onLeave>Goodbye World</onLeave>
</friendlyText>

Bitte beachten : Nur der Einfachheit halber ist die "Zielstruktur" hier inline. In einem realen Fall wäre es besser, die "Zielstruktur" in einer separaten Datei aufzubewahren und sie mit dem Befehl document() Funktion. Nur die Zeile:

 <xsl:variable name="vTarget" select="document('')/*/my:target/*"/>

muss geändert werden in:

 <xsl:variable name="vTarget" select="document('someFileUrl')/*"/>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X