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

时间:2014-01-23 22:55:32

标签: xml xslt xslt-1.0

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

2 个答案:

答案 0 :(得分:2)

您使用的XSLT可以在XSLT 2.0中使用。

问题在于,在XSLT 1.0中,您的 TestVariable 变量拥有所谓的“结果树片段”,因此XSLT无法访问它,因为它确实需要一个节点集。您可以通过扩展功能将其转换为节点集。实际上,该函数名为node-set

所以,你可以这样做

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

但正如你所指出的,这会限制其可移植性。

还有另一种方法,那就是使用文档函数来允许XSLT将自身引用为输入文档。只需定义一个像这样的变量

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

然后你可以这样做

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

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

尝试这个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>

答案 1 :(得分:1)

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

OUTPUT -

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