从xsl变量获取xpath

时间:2009-01-14 16:44:41

标签: xslt xpath

我试图使用xsl ver 1.0从xsl变量获取一些xpath。 那是我的变量:

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

我正在尝试使用RefTag值获得bbb attribure值:

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

这不起作用。

VS XSL Debugger返回错误: “要在路径表达式中使用结果树片段,首先使用msxsl:node-set()函数将其转换为节点集。”

我不明白如何使用msxsl:node-set()函数,无论如何我不想使用msxsl namesapce。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:8)

一个不需要xxx:node-set()扩展名的解决方案如下:

<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()函数,以便作为xml文档中的元素访问所需的<xsl:variable>

答案 1 :(得分:1)

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

您可以通过将变量内容移动到源xml来避免msxsl命名空间。

答案 2 :(得分:-1)

假设这个XML:

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

这样的事情可行:

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