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