首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><xsl:value-of>在模板中无效

<xsl:value-of>在模板中无效
EN

Stack Overflow用户
提问于 2013-04-10 16:26:16
回答 1查看 891关注 0票数 1

我花了两个小时在网上寻找帮助,但我没有找到任何答案.

我希望你能:)

因此,我的xslt文件如下(简化):

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="basename"/>
    <xsl:param name="purpose"/>
    <xsl:param name="xml_input_path"/>
    <xsl:param name="self"/>

    <xsl:template match="testspec">
        <xsl:call-template name="call_commands"/>
    </xsl:template>

    <xsl:template name="call_commands">
        <xsl:variable name="root" select="document($xml_input_path)/testspec"/>
        <xsl:for-each select="$root//command">
            <xsl:sort select="."/>
            <xsl:variable name="current" select="."/>
            <xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="TOTO_short">
        <xsl:text>Fonction TOTO :</xsl:text>
        <xsl:variable name="dda" select="'b'"/>
        <xsl:copy-of select="$dda"/>
    </xsl:template>

    <xsl:template name="TATA_interrupt">
                Fonction TATA :
        <xsl:variable name="v1_name" select="'NaN'"/>
        <xsl:value-of select="$v1_name" />
    </xsl:template>
</xsl:stylesheet>

以下是我输入的Xml:

代码语言:javascript
复制
<testspec>
   <command label="TOTO_short"/>
   <command label="TATA_interrupt"/>
   <command label="TOTO_short"/>
   <command label="TATA_interrupt"/>
</testspec>

我的问题是:在模板TOTO_short和TATA_short中,我想定义两个变量并显示它们的值.

但这不管用!

你能帮我弄清楚它的来源吗?

(预先谢谢:)

阿诺德

EN

回答 1

Stack Overflow用户

发布于 2013-04-10 17:32:39

问题是这条看起来很疯狂的线条

代码语言:javascript
复制
<xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/>

看起来,您正在尝试使用名称等于当前label属性的名称调用命名模板。但是要调用命名模板,必须使用xsl:call-template.要使当前的xsl:apply-templates找到任何内容,您需要一个如下模板:

代码语言:javascript
复制
<xsl:template match="xsl:template[@name='TOTO_short']">
    <xsl:call-template name="TOTO_short" />
</xsl:template>

这真的不是做事情的方法!命名模板出现工作的原因是这里使用了XSLT中的内置模板。当它找不到像上面这样的匹配模板时,它只会输出元素的文本。

我并不认为有必要采取如此复杂的办法。与当前的xsl:for-不同,您只需执行以下操作:

代码语言:javascript
复制
<xsl:apply-templates select="$root//command" />

然后有一个匹配的模板,如下所示:

代码语言:javascript
复制
<xsl:template match="command[@label='TOTO_short']">
    <xsl:text>Fonction TOTO :</xsl:text>
    <xsl:variable name="dda" select="'b'"/>
    <xsl:copy-of select="$dda"/>
</xsl:template>

试试这个XSLT

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="basename"/>
    <xsl:param name="purpose"/>
    <xsl:param name="xml_input_path" select="'C:\Users\Tim Case\Documents\Test.xml'" />
    <xsl:param name="self"/>

    <xsl:template match="testspec">
        <xsl:call-template name="call_commands"/>
    </xsl:template>

    <xsl:template name="call_commands">
        <xsl:variable name="root" select="document($xml_input_path)/testspec"/>
        <xsl:apply-templates select="$root//command" />
    </xsl:template>

    <xsl:template match="command[@label='TOTO_short']">
        <xsl:text>Fonction TOTO :</xsl:text>
        <xsl:variable name="dda" select="'b'"/>
        <xsl:copy-of select="$dda"/>
    </xsl:template>

    <xsl:template match="command[@label='TATA_interrupt']">
                Fonction TATA :
        <xsl:variable name="v1_name" select="'NaN'"/>
        <xsl:value-of select="$v1_name" />
    </xsl:template>
</xsl:stylesheet>

实际上,我不知道为什么要将路径作为参数传递到XML。实际上,可以将XSLT简化为:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="basename"/>
    <xsl:param name="purpose"/>

    <xsl:template match="testspec">
        <xsl:apply-templates select="command" />
    </xsl:template>

    <xsl:template match="command[@label='TOTO_short']">
        <xsl:text>Fonction TOTO :</xsl:text>
        <xsl:variable name="dda" select="'b'"/>
        <xsl:copy-of select="$dda"/>
    </xsl:template>

    <xsl:template match="command[@label='TATA_interrupt']">
                Fonction TATA :
        <xsl:variable name="v1_name" select="'NaN'"/>
        <xsl:value-of select="$v1_name" />
    </xsl:template>
</xsl:stylesheet>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15931360

复制
相关文章

相似问题

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