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