Announcement

Collapse
No announcement yet.

Teilbaum in Variable speichern

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

  • Teilbaum in Variable speichern

    Hallo,

    ich hab ein Problem und weiss gerade einfach nicht mehr weiter.

    Idee:
    Ich möchte ein Teilkonstrukt eines XML-Baumes in einer Variable speichern.
    Aus der Variable möchte ich mir später dann gewisse Daten herausholen.

    Aktueller Code:
    XML-Input-Datei
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <test>
        <service name="Service1" id="11" />
        <service name="Service2" id="22"/>
        <service name="Service3" id="33"/>
    </test>
    xslt-Datei:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet 
        version="2.0"
        xmlns="test"
        xmlns:fn="http://www.w3.org/2005/xpath-functions"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        
        <xsl:output
            method="xml"
            encoding="UTF-8"
            indent="yes"/>
        
        <xsl:template match="/">
    
            <xsl:variable name="test">
                <Status>
                    <xsl:for-each select="//service/@name">
                        <Service>
                            <xsl:attribute name="name">
                                <xsl:value-of select="."/>
                            </xsl:attribute>
                            <xsl:attribute name="id">
                                <xsl:value-of select="position()"></xsl:value-of>
                            </xsl:attribute>
                        </Service>
                    </xsl:for-each>
                </Status>
            </xsl:variable>
    
            <test>
                <!-- Test: output -->
                <xsl:copy-of select="$test"></xsl:copy-of>
    
                <!-- suche in der Variablen -->
                <xsl:variable name="search" select="'Service1'" />
                <xsl:variable name="result">
                    <xsl:value-of select="$test/Status/Service[@name=$search]/@id"/>
                </xsl:variable>
                <id-result>
                    <xsl:attribute name="Service" select="$search" />
                    <xsl:attribute name="id_neu" select="$result" />
                    <xsl:attribute name="debug" select="//service[@name=$search]/@id" />
                </id-result>
            </test>        
        </xsl:template>
        
    </xsl:stylesheet>
    Das Problem ist im letzten Abschnitt. Als Ergebnis erhalte ich:
    Code:
       <id-result Service="Service1" id_neu="" debug="11"/>
    Korrekt sollte es aber so sein: id-neu="1" und nicht leer

    Ich nutze den Saxon PE 9.2.0.3

    Vielleicht kann mir jemand helfen,
    Vielen Dank

  • #2
    Was soll xmlns="test"? Damit werden die Resultatselemente, die du im Stylesheet erzeugst, in diesen Namensraum gepackt. Deine XPath-Ausdrücke wie $test/Status/Service selektieren aber Elemente in keinem Namensraum. Du solltest also entweder das xmlns="test" ganz entfernen oder zumindest per
    Code:
    <xsl:variable name="test" xmlns="">...</xsl:variable>
    für den Inhalt der Variablen ausser Kraft setzen. Oder du muss xpath-default-namespace="test" verwenden, dann aber wieder nur selektiv, wenn du den Inhalt der Variablen selektierst, da ja die Elemente im primären XML-Dokument nicht aus diesem Namensraum sind.

    Comment


    • #3
      ach so ein mist, da war wirklich der Fehler!
      Ich hatte vermutet, dass er den Namespace automatisch nimmt.

      Danke für den Hinweis

      Comment

      Working...
      X