XSLT:如何从变量内的某个元素中获取值



我在XSLT中做了一个变量,我正在尝试从变量中的元素读取一个值。尝试调试时,我会在Visual Studio中收到以下错误消息:

"要在路径表达式中使用结果树片段,请先将其转换 使用mxsxl:node-set()函数到节点集"。

据我了解,mssxl不是"真实" XSLT函数,并且可能在某些系统上不起作用。所以我不想使用它。

如何从XSLT中变量中的某个元素中获得值?

这是我的代码。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >     
  <xsl:variable name ="TestVariable">
        <video id ="0">foo1</video>
        <video id ="2">foo2</video>
        <video id ="3">foo3</video>
        <video id ="4">foo4</video>
        <video id ="5">foo5</video>
        <video id ="6">foo6</video>
    </xsl:variable>
   <xsl:template match="/">
    <outofloop>
      <a2>
       <xsl:value-of select="$TestVariable/video[@id='6']" />
      </a2>
    </outofloop>
  </xsl:template>
</xsl:stylesheet>

您拥有的XSLT将在XSLT 2.0中使用。

问题是,在XSLT 1.0中,您的 testvariable 变量保留所谓的"结果树片段",因此XSLT无法访问它,因为它确实需要节点设置。您可以通过扩展功能将其转换为节点集。实际上,该函数被有用命名为节点集。

所以,您可以这样做

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:ms="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="ms">
  <xsl:variable name ="TestVariable">
        <video id ="0">foo1</video>
        <video id ="2">foo2</video>
        <video id ="3">foo3</video>
        <video id ="4">foo4</video>
        <video id ="5">foo5</video>
        <video id ="6">foo6</video>
    </xsl:variable>
   <xsl:template match="/">
    <outofloop>
      <a2>
       <xsl:value-of select="ms:node-set($TestVariable)/video[@id='6']" />
      </a2>
    </outofloop>
  </xsl:template>
</xsl:stylesheet>

,但是正如您指出的那样,这将限制其可移植性。

有另一种方法,那就是使用 document 函数允许XSLT作为输入文档将其引用。只需定义一个像so

的变量
<xsl:variable name="Test" select="document('')//xsl:variable[@name='TestVariable']" />

然后您可以做这个

<xsl:value-of select="$Test/video[@id='6']" />

因为 test 是指输入文档,现在它直接保存节点集,因此不需要扩展功能。

尝试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name ="TestVariable">
        <video id ="0">foo1</video>
        <video id ="2">foo2</video>
        <video id ="3">foo3</video>
        <video id ="4">foo4</video>
        <video id ="5">foo5</video>
        <video id ="6">foo6</video>
    </xsl:variable>
    <xsl:variable name="Test" select="document('')//xsl:variable[@name='TestVariable']" />
   <xsl:template match="/">
    <outofloop>
      <a2>
       <xsl:value-of select="$Test/video[@id='6']" />
      </a2>
    </outofloop>
  </xsl:template>
</xsl:stylesheet>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

    <xsl:variable name ="TestVariable">
        <video1 id ="0">foo1</video1>
        <video2 id ="2">foo2</video2>
        <video3 id ="3">foo3</video3>
        <video4 id ="4">foo4</video4>
        <video5 id ="5">foo5</video5>
        <video6 id ="6">foo6</video6>
    </xsl:variable>
    <xsl:template match="/">
        <outofloop>
            <a2>
                <xsl:value-of select="$TestVariable/video6/node()" />
            </a2>
        </outofloop>
    </xsl:template>
</xsl:stylesheet>

输出 -

<outofloop><a2>foo6</a2></outofloop>

相关内容

  • 没有找到相关文章

最新更新