it-swarm.com.de

xsl: Variable als xpath-Wert für andere xsl-Tags

Ich habe Probleme mit xsl:variable. Ich möchte eine Variable mit einem Wert erstellen, der vom Wert eines anderen XML-Knotenattributs abhängt. Das funktioniert gut. Wenn ich jedoch versuche, eine Variable mit einem Stringwert zu erstellen, der XPath darstellt, funktioniert es nicht, wenn ich versuche, sie als XPath in einem späteren XSL-Tag zu verwenden. 

<xsl:variable name="test">  
  <xsl:choose>
    <xsl:when test="node/@attribute=0">string/represent/xpath/1</xsl:when>
    <xsl:otherwise>string/represent/xpath/2</xsl:otherwise>
  </xsl:choose>       
</xsl:variable>                 
<xsl:for-each select="$test">
  [...]
</xsl:for-each>

Ich habe versucht: Wie verwende ich die xsl-Variable in xsl, wenn Und Probleme mit xsl: für jede Auswahl mit xsl: variable . Aber ohne Ergebnisse.

14
igor milla

Wenn diese Pfade wie dieser Fall im Voraus bekannt sind, können Sie Folgendes verwenden:

<xsl:variable name="vCondition" select="node/@attribute = 0"/>
<xsl:variable name="test" select="actual/path[$vCondition] |
                                  other/actual/path[not($vCondition)]"/>
10
user357812

Die dynamische Auswertung eines XPath-Ausdrucks wird im Allgemeinen in XSLT (sowohl 1.0 als auch 2.0) nicht unterstützt.

Wir können einen eher allgemeinen dynamischen XPath-Evaluator implementieren, wenn wir nur jeden Standortpfad auf einen Elementnamen beschränken :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="inputId" select="'param/yyy/value'"/>

 <xsl:variable name="vXpathExpression"
  select="concat('root/meta/url_params/', $inputId)"/>

 <xsl:template match="/">
  <xsl:value-of select="$vXpathExpression"/>: <xsl:text/>

  <xsl:call-template name="getNodeValue">
    <xsl:with-param name="pExpression"
         select="$vXpathExpression"/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="getNodeValue">
   <xsl:param name="pExpression"/>
   <xsl:param name="pCurrentNode" select="."/>

   <xsl:choose>
    <xsl:when test="not(contains($pExpression, '/'))">
      <xsl:value-of select="$pCurrentNode/*[name()=$pExpression]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="getNodeValue">
        <xsl:with-param name="pExpression"
          select="substring-after($pExpression, '/')"/>
        <xsl:with-param name="pCurrentNode" select=
        "$pCurrentNode/*[name()=substring-before($pExpression, '/')]"/>
      </xsl:call-template>
    </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

wenn diese Transformation auf dieses XML-Dokument angewendet wird :

<root>
  <meta>
    <url_params>
      <param>
        <xxx>
          <value>5</value>
        </xxx>
      </param>
      <param>
        <yyy>
          <value>8</value>
        </yyy>
      </param>
    </url_params>
  </meta>
</root>

das gewünschte, korrekte Ergebnis wird erzeugt :

root/meta/url_params/param/yyy/value: 8
12

Dies ist in XSLT 1.0 nicht nativ möglich, Sie können jedoch eine Erweiterungsbibliothek wie dyn verwenden:

http://www.exslt.org/dyn/functions/evaluate/dyn.evaluate.html

Die dyn:evaluate-Funktion wertet eine Zeichenfolge als XPath-Ausdruck aus.

0
Zkoh