如何从特定节点xsl获取变量值?

时间:2017-05-01 17:29:58

标签: xml xslt

我是新来的。如何为我的变量名称检索值“blob”:“FLOP”?

提前致谢

XML:

<ROOT><XML><Oxo Txt="blob"></Oxo></XML></ROOT>

公式:

<xsl:template match="/">
<xsl:variable name="FLOP">
<xsl:value-of select="*//Oxo/@Txt"></xsl:value-of>
</xsl:variable>
</xsl:template>

其实我一无所获......

1 个答案:

答案 0 :(得分:0)

基本

目前尚不清楚你正在尝试做什么。 XSL变量仅存储值。您当前的模板仅创建变量并存储给定XPath表达式指向的值。

如果您尝试输出您的值,则需要添加一行:

<xsl:template match="/">
    <xsl:variable name="FLOP">
        <xsl:value-of select="*//Oxo/@Txt"></xsl:value-of>
    </xsl:variable>

    <!-- You need to output the value if you want to actually see it: -->
    <xsl:value-of select="$FLOP"/>
</xsl:template>

当我针对您的示例输入XML尝试上述模板时,我得到以下输出:

<?xml version="1.0" encoding="UTF-8"?>blob

加细

您可以稍微清理一下XPath表达式。

*//Oxo/@Txt

这分解如下:

*     ⇒ any input node
//Oxo ⇒ any "Oxo" descendant of that node
/@Txt ⇒ the "Txt" attribute of "Oxo"

由于这是在仅与根元素匹配的模板中,*与该根匹配。 //部分可能很昂贵,因为它必须评估后代节点的所有。由于我们从逻辑根开始,这意味着整个文件中的每个元素。您的示例XML很小,所以我们没有注意到这里有任何实际影响 - 但如果您的输入文件很大,那么事情可能会陷入困境。

如果您已经知道所需的Oxo元素的确切位置,那么只需为XPath写一下:

/ROOT/XML/Oxo/@Txt

您还可以收紧变量XSL。

    <xsl:variable name="FLOP">
        <xsl:value-of select="*//Oxo/@Txt"></xsl:value-of>
    </xsl:variable>

xsl:variable元素允许自己的select语句。我们可以将这个变量表达式缩短为一行,在我们更具体的XPath中填充它们:

    <xsl:variable name="FLOP" select="/ROOT/XML/Oxo/@Txt"/>