首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使xsl:value-of dynamic?

如何使xsl:value-of dynamic?
EN

Stack Overflow用户
提问于 2017-03-10 19:45:24
回答 2查看 480关注 0票数 1

考虑一下,<xsl:value-of select="@select"/>输出/root/name。我希望传递给value-of的求值表达式,因此它在XML中选择特定的值。

我想做的全部代码:

XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <xsl:value-of select="/root/name"/>
    <name>Foo</name>
</root>

XSL:

代码语言:javascript
复制
<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。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-10 20:25:01

首先,您的输入不是XML:如果不将前缀绑定到命名空间,则无法具有前缀。

更重要的是,select属性的值是字符串"/root/name"。您不能在XSLT1.0或2.0中将字符串计算为XPath表达式(除非您的处理器碰巧支持某种evaluate()扩展函数*)。

我不知道你到底在做什么,但我怀疑你需要重新考虑你的策略。也许您需要从从输入文档生成XSLT样式表开始,然后第二次将样式表应用于输入。

(*)例如,使用libxsltXalan-J处理器,您可以处理以下格式良好的输入:

XML

代码语言:javascript
复制
<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:value-of select="/root/name"/>
    <name>Foo</name>
</root>

使用以下样式表:

XSLT1.0

代码语言:javascript
复制
<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>

获得:

结果

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<results>
  <result>Foo</result>
</results>
票数 1
EN

Stack Overflow用户

发布于 2017-03-10 20:25:00

不,XPath表达式的动态计算需要XSLT3.0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42726553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档