Announcement

Collapse
No announcement yet.

In <xsl:template / > einen anderen Node referenzieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • In <xsl:template / > einen anderen Node referenzieren

    Hallo zusammen,

    ich habe ein Projekt "geerbt", bei dem XML-Daten mit XSLT transformiert werden und dann HTML ausgegeben wird. Natürlich versuche ich mich einzulesen, aber die Anforderungsliste wächst schneller als mein XSLT-Sachverstand.

    Ich stehe aktuell vor dem Problem, in einem mit <xsl:template match="NODENAME">-Block den Inhalt eines anderen Elements referenzieren zu müssen. Ich habe bereits gesucht, aber vermutlich ist meine Frage zu banal, als dass ich Sie im Forum fände. ;-)

    Ausgangs-XML:
    Code:
    <DOCLIST xmlns="weblink">
       <STAMMSATZ>
          <D_DOC_NUM>A9900000000099</D_DOC_NUM>
          <D_DOC_TITLE>Test - Doc</D_DOC_TITLE>
          <MAT_ATTRIBUTES>
             <DM_MAT_ATTRIBUTES>
                <DM_MATNR>A2V0000009999</DM_MATNR>
                <DM_MATTEXT>Test - Mat</DM_MATTEXT>
             </DM_MAT_ATTRIBUTES>
          </MAT_ATTRIBUTES>
       </STAMMSATZ>
    </DOCLIST>
    Beim Node MAT_ATTRIBUTES soll nun ein Text ausgegeben werden, der den Wert aus D_DOC_NUM enthält.

    Ich habe es mit <xsl:value-of /> versucht und auch mit <xsl:call-template /> und <xsl:variable /> aber das funktioniert nicht, vermutlich deshalb, weil <xsl:template> immer nur das Match und dessen Children anspricht, richtig?

    Code:
    <xsl:template match="MAT_ATTRIBUTES">
    Doc-Nr: <Ausgabe des Wertes aus D_DOC_NR />
    </xsl:template>
    Wie muss ich da vorgehen, bitte? Ich komme im Moment einfach nicht weiter und wäre für jede Hilfestellung dankbar!

  • #2
    preceding-sibling

    Hey Scroogle,

    folgender Code sollte funktionieren:

    Code:
    <xsl:template match="MAT_ATTRIBUTES">
    Doc-Nr: <xsl:value-of select="preceding-sibling::D_DOC_NUM"/>
    </xsl:template>
    Damit sprichst du das <D_DOC_NUM/>-Element an, welches auf der gleichen Ebene wie <MAT_ATTRIBUTES/> liegt.

    Gruß Z-MAN

    Comment


    • #3
      Code:
      <xsl:template match="DOCLIST/STAMMSATZ" >
       Doc.Nr.:<xsl:value-of select="./D_DOC_NUM" />
      </xsl:template>
      liefert dir auch genau die gewünschte Zeile
      Code:
       Doc.Nr.:A9900000000099
      Allerdings musste ich bei
      <DOCLIST xmlns="weblink">
      den Weblink entfernen, sonst hat mein Transformer gar nicht reagiert. Ist evtl. das gleiche Problem was du auch hast...

      Comment


      • #4
        Originally posted by Z-MAN View Post
        Code:
        <xsl:template match="MAT_ATTRIBUTES">
        Doc-Nr: <xsl:value-of select="preceding-sibling::D_DOC_NUM"/>
        </xsl:template>
        Gruß Z-MAN
        mit dem Code von Z-MAN bekomme ich folgende Ausgabe
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
           
              A9900000000099
              Test - Doc
              
        Doc-Nr: A9900000000099
        versteh zwar nicht ganz warum, aber ich vermute das liegt evtl. am Transformer. Ich habe Saxon verwendet...

        Comment


        • #5
          Die XML-Elemente liegen im Default-Namensraum, welcher auch im XSLT-Stylesheet verwendet werden muss (hier mit willkürlich gewähltem Prefix wl):
          Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:wl="weblink">
          
            <xsl:template match="/">
              <xsl:apply-templates select="//wl:MAT_ATTRIBUTES"/>
            </xsl:template>
          
            <xsl:template match="wl:MAT_ATTRIBUTES">
              Doc-Nr: <xsl:value-of select="preceding-sibling::wl:D_DOC_NUM"/>
            </xsl:template>
          
          </xsl:stylesheet>
          Bei Verwendung von XSLT 2.0 reicht die Angabe des Namensraumes als xpath-default-namespace="..." bei xsl:stylesheet aus und das Prefix kann entfallen.

          Comment

          Working...
          X