Christin: X-Path Probleme

Hallo,

<xml>
 <patch name="112905-02 ">
 <veraltet>112713-02, 112233-12 </veraltet>
 </patch>
 <patch name="114209-09 ">
 <veraltet>114728-08, 118736-12, 134886-03 </veraltet>
 </patch>
 <patch name="112233-12 ">
 <veraltet>117392-01, 119382-10 </veraltet>
 </patch>
[...]
</xml>

brauch ein xsl-template, mir fehlen leider einige x-path kenntnisse.
ich möchte, dass jeder "patch name" mit allen im Programm veralteten Patches verglichen wird, um zu überprüfen ob ein "veralteter Patch" = "Patch name" ist. falls dies der fall ist, soll er angezeigt werden.
(oben im Beispiel würde der 3. Patch ausgegeben werden, da er ein veralteter vom 1. Patch ist)

ich habs bisher so versucht:

<xsl:template match="patch">
        <xsl:if test="./@name">
            <xsl:for-each select="./patch/veraltet">
               xsl:choose
                <xsl:when test="@name[contains(node(),'veraltet')]">
                    <tr valign="top" bgcolor="#f5deb3">
                      <td width="100px" align="center">
                      <xsl:value-of select="./@name"/>
                      </td>
                      <td width="200px" align="center">
                      <xsl:value-of select="./veraltet"/>
                      </td>
                   </tr>
              </xsl:when>
             </xsl:choose>
           </xsl:for-each>
       </xsl:if>
    </xsl:template>

Hoffe ihr könnt mir helfen.
LG

  1. auf die schnelle an bei ein Muster, allerdings wird nur mit contains im Beispiel geprüft, sollten die patch name keine fest Länge habe etc. mus du die xpath anfrage genauer gestalten:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml"/>
        <xsl:template match="/">
            <xsl:for-each select="xml/patch[contains(preceding-sibling::patch/veraltet/text(),@name) or contains(following-sibling::patch/veraltet/text(),@name)]">
                <xsl:value-of select="@name"/>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>

    Am besten du schaust dir auch noch mal die Xpatch Erläuterungen auf selfhtml and. Die sind relativ gut verständlich.

    Gruß, H.

    Hallo,

    <xml>
    <patch name="112905-02 ">
    <veraltet>112713-02, 112233-12 </veraltet>
    </patch>
    <patch name="114209-09 ">
    <veraltet>114728-08, 118736-12, 134886-03 </veraltet>
    </patch>
    <patch name="112233-12 ">
    <veraltet>117392-01, 119382-10 </veraltet>
    </patch>
    [...]
    </xml>

    brauch ein xsl-template, mir fehlen leider einige x-path kenntnisse.
    ich möchte, dass jeder "patch name" mit allen im Programm veralteten Patches verglichen wird, um zu überprüfen ob ein "veralteter Patch" = "Patch name" ist. falls dies der fall ist, soll er angezeigt werden.
    (oben im Beispiel würde der 3. Patch ausgegeben werden, da er ein veralteter vom 1. Patch ist)

    ich habs bisher so versucht:

    <xsl:template match="patch">
            <xsl:if test="./@name">
                <xsl:for-each select="./patch/veraltet">
                   xsl:choose
                    <xsl:when test="@name[contains(node(),'veraltet')]">
                        <tr valign="top" bgcolor="#f5deb3">
                          <td width="100px" align="center">
                          <xsl:value-of select="./@name"/>
                          </td>
                          <td width="200px" align="center">
                          <xsl:value-of select="./veraltet"/>
                          </td>
                       </tr>
                  </xsl:when>
                 </xsl:choose>
               </xsl:for-each>
           </xsl:if>
        </xsl:template>

    Hoffe ihr könnt mir helfen.
    LG

    1. auf die schnelle an bei ein Muster, allerdings wird nur mit contains im Beispiel geprüft, sollten die patch name keine fest Länge habe etc. mus du die xpath anfrage genauer gestalten:

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
          <xsl:output method="xml"/>
          <xsl:template match="/">
              <xsl:for-each select="xml/patch[contains(preceding-sibling::patch/veraltet/text(),@name) or contains(following-sibling::patch/veraltet/text(),@name)]">
                  <xsl:value-of select="@name"/>
              </xsl:for-each>
          </xsl:template>
      </xsl:stylesheet>

      Am besten du schaust dir auch noch mal die Xpatch Erläuterungen auf selfhtml and. Die sind relativ gut verständlich.

      Gruß, H.

      Deine Anweisung scheint zu super zu funktionieren.
      Wie baue ich sie in mein template match="patch" ein?
      danke nochmal

      1. Ich bin ja jetzt schon im template patch. das programm führt quasi eh schon für jeden patch dieses template durch. was ja an sich schon eine schleife darstellt. ich habs jetzt einfach mal so gemacht:

        <xsl:template match="patch">

        <xsl:for-each select="xml/patch[contains(preceding-sibling::patch/veraltet/text(),@name) or contains(following-sibling::patch/veraltet/text(),@name)]">
                        <xsl:value-of select="@name"/>

        </xsl:for-each>

        </xsl:template>

        funktioniert leider net.

        1. Da dein komplettes Stylesheet mir verborgen bleibt, ist es muehsig zu raten, wie man es am saubersten bzw. besten machen kann, insbesondere mit den aufrufen. wieder als schnell möglichkeit koenntest du folgendes verwenden:

          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
              <xsl:output method="html"/>
              <xsl:template match="patch">
                  <xsl:variable name="PatchTest" select="@name"/>
                  <tr>
                      <!-- fuer knoten die über dem aktuellen knoten auf gleicher ebene der abfrage entsprechen -->
                      <xsl:for-each select="preceding-sibling::patch[contains(child::veraltet,$PatchTest)]">
                          <td>
                              xsl:text Alter Patch </xsl:text>
                              <xsl:value-of select="$PatchTest"/>
                              xsl:text ersetzt durch Patch </xsl:text>
                              <xsl:value-of select="@name"/>
                          </td>
                      </xsl:for-each>
                      <!-- fuer knoten die unter dem aktuellen knoten auf gleicher ebene der abfrage entsprechen -->
                      <xsl:for-each select="following-sibling::patch[contains(child::veraltet,$PatchTest)]">
                          <td>
                              xsl:text alter Patch </xsl:text>
                              <xsl:value-of select="$PatchTest"/>
                              xsl:text ersetzt durch Patch </xsl:text>
                              <xsl:value-of select="@name"/>
                          </td>
                      </xsl:for-each>
                  </tr>
              </xsl:template>
          </xsl:stylesheet>

          Die Variable enthält den veralteten Patch Namen, nachdem du suchst. Ich wuerde aber hier nicht apply-template, sondern eher call-tamplete verwenden. Wie auch immer, es fuehren viele Wege nach Rom.

          Gruß, H.

          1. danke, echt spitze, dass es so hilfsbereite menschen gibt. läuft