代码之家  ›  专栏  ›  技术社区  ›  Pete Duncanson

XSL:如何最好地将节点存储在变量中,然后在将来的xpath表达式中使用它?

  •  16
  • Pete Duncanson  · 技术社区  · 15 年前

    我需要能够将节点集存储在变量中,然后在之后对其执行更多的过滤/排序。我看到的所有例子都涉及到使用XSL2或扩展,这两者都不是真正的选项。

    <xsl:variable name="hotels" select="/results/hotels[active='true']" />
    <xsl:variable name="3_star_or_less" select="/results/hotels[number(rating) <= 3]" />
    <xsl:for-each select="3_star_or_less">
      <xsl:sort select="rating" />
    </xsl:for-each>
    

    有没有人能举一个最好的例子来说明如何做这类事情?

    3 回复  |  直到 5 年前
        1
  •  24
  •   Rubens Farias    15 年前

    试试这个例子:

    <xsl:variable name="hotels" select="/results/hotels[active='true']" />
    <xsl:variable name="three_star_or_less"
                  select="$hotels[number(rating) &lt;= 3]" />
    <xsl:for-each select="$three_star_or_less">
        <xsl:sort select="rating" />
        <xsl:value-of select="rating" />
    </xsl:for-each>
    
        2
  •  6
  •   Pavel Minaev    15 年前

    在XSLT1.0中,在变量中存储节点集没有问题,并且不需要扩展。如果您只是在中使用XPath表达式 select 属性 xsl:variable

    只有当您想要存储 在一个变量中,甚至只有当您以后想查询它们时。这里的问题是,您输出的节点没有“节点集”类型——相反,它们被称为“结果树片段”。您可以将其存储到变量中,稍后可以使用该变量将片段插入到输出(或另一个变量)中,但不能使用XPath对其进行查询。那是你需要EXSLT的时候 node-set() 函数(将结果树片段转换为节点集)或XSLT 2.0(其中没有结果树片段,只有节点序列,而不管它们来自何处)。

    对于您给出的示例,这似乎不是问题。鲁本斯的回答给出了确切的语法。

        3
  •  5
  •   K0D4    12 年前

    <xsl:copy-of select="."/> 而不是 <xsl:value-of select="."/>

    的值将仅获取节点的文本,您将无法使用节点集函数返回任何有意义的内容。

    <xsl:variable name="myStringVar">
       <xsl:value-of select="."/>
    </xsl:variable>
    
    <!-- This won't work: -->
    <Output>
       <xsl:value-of select="node-set($myStringVar)/SubNode" />
    </Output>
    
    
    <xsl:variable name="myNodeSetVar">
       <xsl:copy-of select="."/>
    </xsl:variable>
    
    <!-- This will work: -->
    <Output>
       <xsl:value-of select="node-set($myNodeSetVar)/SubNode" />
    </Output>