Get xpath from xsl variable

I am trying to get xpath of xsl variable using xsl ver 1.0. This is my variable:

  <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>

I am trying to get the value of the bbb attribute using the value of RefTag:

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

this does not work.

VS XSL Debugger returns an error: "To use a fragment of the resulting tree in the path expression, first convert it to node-set using the msxsl: node -set () function.

I do not understand how to use the msxsl: node -set () function, and in any case, I prefer not to use msxsl namesapce.

Can anyone help here?

+5
source share
3 answers

One solution that does not require the xxx extension: node -set () is the following:

<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>

XML- ( ), :

false

XSLT document(), <xsl:variable> XML-.

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

msxsl, xml.

+1

Assuming this XML:

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

Something like this might work:

<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>
-1
source

All Articles