Thomas J.S.: war: Zwei-Phasen-Transformation 2. Versuch -->die Antwort

Beitrag lesen

Hallo,
jemand hat schon in zwei threads nachgefragt:

http://forum.de.selfhtml.org/archiv/2002/5/11560/ und
http://forum.de.selfhtml.org/archiv/2002/5/11589/

nachdem ich einen halben roman schon geschriben habe, meinte mein win98 sich (und den pc) einfach neu booten zu müssen. und jetzt hat auch noch der Archivscript zugeschlagen
ich werde jetzt nicht alles wiederholen was ich vorher geschrieben habe.

danke für die vielen Antworten, aber ich meine,

dass es besser gewesen wäre den thread unten fortzusetzen, damit alles zusammenbleibt um im archiv dann auch so von anderen gefunden werden kann?
ja, 'wir' lesen bis ganz nach unten im forum.

Ich möchte per XML Schnittstellen beschreiben und zwar sehr viele Schnittstellen. Jede Schnittstelle hat einen input und einen output, input und output wiederum besitzen felder.

was ist für dich eine schnittstelle? eine XML datei?

welche die Schnittstelle nutzen, die Schnittstellenbeschreibung in einem schön aufgemotzten HTML file mit jedem Browser abfragen können. (Irgendwann möchte ich die Transformation dann am Webserver machen)

wie machst du denn jetzt die transformation? klientseitig? dann kannst nicht mir jeden browser das machen und wenn du keine serverseitige transformation hast sind deine möglichkeiten auch etwas begrenzt.

Nun kommt dieses Feld "returncode" praktisch in jeder Schnittstelle vor

was ist für dich eine schnittstelle? eine XML datei?

und hat immer die gleichen Daten. Nun will ich diese Daten aber nicht bei jeder Schnittstelle angeben müssen. Denn sollte sich bei diesem Feld was ändern, müssten ich ja wieder alle Schnittstellen-XML-files angreifen.

schreibst du deine xml dateien selbst, oder werden sie automatisch erzeugt.

Mein erster Gedanke war, für dieses Feld einfach ein template zu erstellen, genau so, wie ihr mir es empfohlen habt:
Was mir dabei aber nicht gefällt ist, dass die HTML-Formatierung eines Feldes an mehreren Stellen im XSL file existiert (geht mal davon aus, dass es mehr solche "allgemeinen" Felder gibt)

es sind zwei versch. dinge eine html-formatierung an mehreren stellen zu haben: dazu kannst du versch. modi verwenden (das habe ich schon weiter unten gepostet), oder viele versch returncodes zu haben.

Daher würd ich gerne diese "allgemeinen Felder" vor der HTML-Transformation in die entspr. XML-Definition wandeln, also
<field name="returncode" />
soll zu
<field name="returncode" format="String(8)">
  <description>Ein 8stelliger Returncode</description>
</field>
werden.

wenn du viele solche returncodes hat: wocher soll dein xsl sheet wissen wann er format="String(8)" und wann er format="numeric" erzuegen soll?

hmmm ... bin ich eigentlich schon an die "zu spezifisch"-Grenze gestoßen? :)

nein, aber du gibst nach wie vor zu wenig informationen um zu nachvollziehen was du eigentlich machst (machen möchtest)

Also meine Frage, muss ich das selber programmieren (weil im Prinzip kommt das ja nur einem Suchen&Ersetzen-Algorithmus gleich), oder weiss jemand eine Möglichkeit, dass mit XSL zu realisieren?

xslt ist kein suchalgorhytmus und auch mit einem solchen kanns du nicht ein und das selbe ding (dein returncode) durch unterschiedliche dinge ersetzen.

möglichkeiten sind:
du lagerst deine returncode in eine eigene xml datei aus und grifst dann mit der document() funktion vom xslt auf die daten darin zu.
dann brauchst du dein komplettes xml nur einmal schreiben.

du kannst auch eine xml-->xslt-->xml-->xslt-->html weiterleitung machen aber das hängt sehr davon ab was du am server für die verarbeitung verwendest.

du kannst wie folgt versuchen:
------- die xml datei ---
<?xml version="1.0"?>
<?xml-stylesheet href="brunft.xsl" type="text/xsl"?>
<interface name="phytagoras">
  <input>
    <field name="a" format="numeric" mandatory="true">
      <description>Kathete</description>
    </field>
    <field name="b" format="numeric" mandatory="true">
      <description>Kathete</description>
    </field>
  </input>
    <output>
    <field name="c" format="numeric">
      <description>Hypotenuse</description>
    </field>
  </output>
</interface>
-----------
------ die xsl datei ----------
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dings="dings.uri"
exclude-result-prefixes="dings">

<xsl:template match="/interface">
  <html><body>
  <xsl:apply-templates />

</body></html>
</xsl:template>
<xsl:template match="text()"></xsl:template>
<xsl:template match="input">
 <xsl:for-each select="field">
  <div style="border:solid 1px blue">
  <xsl:for-each select="@*"><p><xsl:value-of select="." /></p></xsl:for-each>
  <p><xsl:value-of select="description" /></p>
  </div>
 </xsl:for-each>
</xsl:template>

<xsl:template match="output">
 <xsl:for-each select="field">
  <div style="border:solid 1px red">
  <xsl:for-each select="@*"><p><xsl:value-of select="." /></p></xsl:for-each>
  <p><xsl:value-of select="description" /></p>
  </div>
 </xsl:for-each>
 <div style="border:solid 1px green">
  <p><xsl:value-of select="document('')/*/dings:field/@name"/></p>
  <p><xsl:value-of select="document('')/*/dings:field/@format"/></p>
  <p><xsl:value-of select="document('')/*/dings:field/dings:description"/></p>
 </div>
</xsl:template>

<dings:field name="returncode" format="dingsda">
      dings:descriptionwas auch immer</dings:description>
    </dings:field>

</xsl:stylesheet>

-------------
----- html von saxon -------
<html>
   <body>
      <div style="border:solid 1px blue">
         <p>a</p>
         <p>numeric</p>
         <p>true</p>
         <p>Kathete</p>
      </div>
      <div style="border:solid 1px blue">
         <p>b</p>
         <p>numeric</p>
         <p>true</p>
         <p>Kathete</p>
      </div>
      <div style="border:solid 1px red">
         <p>c</p>
         <p>numeric</p>
         <p>Hypotenuse</p>
      </div>
      <div style="border:solid 1px green">
         <p>returncode</p>
         <p>dingsda</p>
         <p>was auch immer</p>
      </div>
   </body>
</html>
-----------------

grüße
thomas