2009-01-14 6 views
5

Próbuję uzyskać trochę xpath ze zmiennej xsl przy użyciu xsl ver 1.0. To moja zmienna:pobierz xpath ze zmiennej xsl

<xsl:variable name ="myVar"> 
     <RefData RefTag="test1" bbb="false" /> 
     <RefData RefTag="test2" bbb="false" /> 
     <RefData RefTag="test3" bbb="false" /> 
     <RefData RefTag="test4" bbb="true" /> 
     <RefData RefTag="test5" bbb="false" /> 
     <RefData RefTag="test6" bbb="false" /> 
    </xsl:variable> 

Próbuję dostać BBB wartość attribure użyciu wartości RefTag:

<xsl:if test="$myVar/RefData[@RefTag = 'test3']/@bbb"> 

to nie działa.

VS XSL Debugger zwraca błąd: "Aby użyć fragmentu drzewa wynikowego w wyrażeniu ścieżki, najpierw przekonwertuj go do zestawu węzłów za pomocą funkcji msxsl: node-set()."

Nie rozumiem, jak korzystać z funkcji msxsl: node-set(), a zresztą wolę nie używać namesaps nazw msxsl.

Czy ktoś może pomóc tutaj?

Odpowiedz

8

Jednym z rozwiązań, które nie potrzebują xxx: node-set() przedłużenie jest następujący:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<!--           --> 
    <xsl:variable name ="myVar"> 
     <RefData RefTag="test1" bbb="false" /> 
     <RefData RefTag="test2" bbb="false" /> 
     <RefData RefTag="test3" bbb="false" /> 
     <RefData RefTag="test4" bbb="true" /> 
     <RefData RefTag="test5" bbb="false" /> 
     <RefData RefTag="test6" bbb="false" /> 
    </xsl:variable> 
<!--           --> 
    <xsl:variable name="vrefVar" select= 
    "document('')/*/xsl:variable[@name='myVar']" 
    /> 
<!--           --> 
    <xsl:template match="/"> 
     <xsl:value-of select="$vrefVar/*[@RefTag='test3']/@bbb"/> 
    </xsl:template> 
</xsl:stylesheet> 

Gdy powyższa transf ORMATION jest stosowana na dowolnym dokumencie XML (nie używany), przy czym poszukiwanych wynik jest produkowany:

false

Należy pamiętać, korzystanie z XSLT document() funkcja w celu uzyskania dostępu do wymaganego <xsl:variable> po prostu jako element w dokumencie XML.

1
<xsl:variable name="myVariable" select="msxsl:node-set($myVar)"/> 

Możesz uniknąć przestrzeni nazw msxsl, przenosząc zmienną zawartość do źródłowego xml.

-1

Zakładając ten XML:

<test1> 
    <RefData RefTag="test1"/> 
    <RefData RefTag="test2"/> 
    <RefData RefTag="test3"/> 
    <RefData RefTag="test4"/> 
    <RefData RefTag="test5"/> 
    <RefData RefTag="test6"/> 
</test1> 

Coś takiego może działać:

<xsl:template match="/"> 
    <xsl:apply-templates select="test1/RefData"/> 
</xsl:template> 

    <xsl:template match="RefData"> 
    <xsl:variable name="myVar"> 
     <xsl:choose> 
     <xsl:when test="@RefTag = 'test1'">false</xsl:when> 
     <xsl:when test="@RefTag = 'test2'">false</xsl:when> 
     <xsl:when test="@RefTag = 'test3'">false</xsl:when> 
     <xsl:when test="@RefTag = 'test4'">true</xsl:when> 
     <xsl:when test="@RefTag = 'test5'">false</xsl:when> 
     <xsl:when test="@RefTag = 'test6'">false</xsl:when> 
     <xsl:otherwise>true</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <!--<text x="{$myVar}"/>--> 
    </xsl:template> 
+0

Myślę, że nie rozumiesz pytania. te dane nie znajdują się w pliku wejściowym xml, więc nie mogę założyć, że xml jest z nami. Potrzebuję użyć zmiennej xsl: variable – Schwartser