考虑一下,<xsl:value-of select="@select"/>
输出/root/name
。我想要传递给value-of
的计算表达式,因此它选择XML中的特定值。
我想完成整个代码:
XML:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<xsl:value-of select="/root/name"/>
<name>Foo</name>
</root>
XSL:
<xsl:template match="xsl:value-of">
<xsl:element name="{name()}">
<xsl:attribute name="select">
<xsl:value-of select="@select"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
期望的输出:
Foo
但它没有输出任何内容,或者只输出/root/name
的其他解决方案。
是否可以使此代码有效?我使用的是XSLT 1.0。
由于
答案 0 :(得分:1)
不,dynamic evaluation of XPath expressions需要XSLT 3.0。
答案 1 :(得分:1)
首先,您的输入不是XML:如果不将其绑定到命名空间,则不能有前缀。
更重要的是,select
属性的值是字符串 "/root/name"
。您无法在XSLT 1.0或2.0中将字符串评估为 XPath表达式(除非您的处理器恰好支持某种evaluate()
扩展函数*)。
我不确定你到底想要完成什么,但我怀疑你需要重新考虑你的策略。也许您需要从输入文档生成XSLT样式表,然后在第二遍中将该样式表应用于输入。
(*)例如,使用libxslt
或Xalan-J
处理器,您可以处理以下格式正确的输入:
<强> XML 强>
<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="/root/name"/>
<name>Foo</name>
</root>
使用以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/root">
<results>
<xsl:apply-templates select="xsl:value-of"/>
</results>
</xsl:template>
<xsl:template match="xsl:value-of">
<result>
<xsl:value-of select="dyn:evaluate(@select)"/>
</result>
</xsl:template>
</xsl:stylesheet>
获得:
<强>结果强>
<?xml version="1.0" encoding="UTF-8"?>
<results>
<result>Foo</result>
</results>