XSLT: String-Processing möglich?



  • Hi Leute,
    stellt euch vor, ich habe in meinem XML-Dokument in einem Node den Wert "Object.Interface.Function" und möchte anhand dieses Wertes einen Node selektieren und zwar nach folgendem XPath-Ausdruck: "//[@name='Object']/descendant::[@name='Interface']/descendant::*[@name='Function']".
    Ist es mit XSLT möglich den einen in den anderen String umzuwandeln, wenn:
    - es sichergestellt ist, dass es genau 2 Punkte sind
    - wenn die Anzahl der Punkte beliebig sein soll

    Danke für eure Antworten.



  • Entweder du kennst die Position der Punkte schon im Voraus, dann kannst du die XPath-Funktion substr verwenden. Oder du kennst sie nicht, dann musst du die EXSLT-Funktionen str:tokenize oder str:split verwenden - oder auf XSLT/XPath 2.0 hoffen.



  • Hi,

    habe es jetzt mit Saxxon und XSLT 2.0 geschafft mir den XPath-Ausdruck zu basteln:

    <xsl:function name="my-fn:createXPathFromQualifiedName">
        <xsl:param name="qualifiedName"/>
        <xsl:variable name="xpath">
          <xsl:for-each select="tokenize($qualifiedName, '\.')">
            <xsl:choose>
              <xsl:when test="position()=1">//</xsl:when>
              <xsl:otherwise>/descendant::</xsl:otherwise>
            </xsl:choose>
            <xsl:text>*[@name=</xsl:text><xsl:value-of select="."/>
            <xsl:text>]</xsl:text>
          </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="generate-id($xpath)"></xsl:value-of>
      </xsl:function>
    

    In der Variable xpath steht das drinne, was ich möchte, der Inhalt der Variable wird aber irgendwie nicht als XPath-Ausdruck verstanden sondern als normaler Text. Wie schaff ich es, dass ein value-of mir mit diesem String die Nodes zeigt die dem XPath-Ausdruck entsprechen?



  • bin jetzt etwas weiter:

    <xsl:function name="my-fn:createXPathFromQualifiedName">
        <xsl:param name="qualifiedName"/>
        <xsl:variable name="xpath">
          <xsl:for-each select="tokenize($qualifiedName, '\.')">
            <xsl:choose>
              <xsl:when test="position()=1">//</xsl:when>
              <xsl:otherwise>/descendant::</xsl:otherwise>
            </xsl:choose>
            <xsl:text>*[@name='</xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>']</xsl:text>
          </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="$xpath"/>
        </xsl:function>
    
    ...
    
    <xsl:variable name="xpath" select="my-fn:createXPathFromQualifiedName($name)"/>
    
    <xsl:value-of select="generate-id(saxon:evaluate($xpath))"/>
    

    Leider beschwert sich jetzt Saxxon mit einer neuen Fehlermeldung:
    "A sequence of more than one item is not allowed as the first argument of generate-id() (<type/>, <section/>) "
    AUch wenn ich den XPath-Ausdruck "von Hand" dort hineinschreibe wo jetzt $xpath steht, funktioniert es nicht so wie geünwscht.

    Hoffe da kennt sich jemand mit aus


Anmelden zum Antworten