考虑一下,<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。
甚至有可能让这个代码工作吗?我使用XSLT1.0。
谢谢
发布于 2017-03-10 20:25:01
首先,您的输入不是XML:如果不将前缀绑定到命名空间,则无法具有前缀。
更重要的是,select属性的值是字符串"/root/name"。您不能在XSLT1.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>使用以下样式表:
XSLT1.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>发布于 2017-03-10 20:25:00
不,XPath表达式的动态计算需要XSLT3.0。
https://stackoverflow.com/questions/42726553
复制相似问题