在XSLT选择中使用变量

时间:2014-08-18 03:51:52

标签: xml xslt xslt-2.0

我正在尝试创建一个命名模板或函数,其中我传递一个节点名称,它将选择它作为xpath表达式的最后一级。但它返回的只是我作为参数传递的字符串。在下面的示例中,返回的值是“name”

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"></xsl:output>

    <xsl:template name="get-prefered">
        <xsl:param name="field-name"/> 

        <xsl:variable name="vCondition" select="name"/>
        <xsl:variable name="x" select="sources/source[@type='C']/$field-name"/>
        <xsl:value-of select="$x"></xsl:value-of>
    </xsl:template>

    <xsl:template match="/">
        <xsl:call-template name="get-prefered">
            <xsl:with-param name="field-name">name</xsl:with-param>
        </xsl:call-template>
        </xsl:template>
</xsl:stylesheet>

INPUT XML:

<?xml version="1.0" encoding="UTF-8"?>
<sources>
    <source type='C'>
        <name>Joe</name>
        <age>10</age>
    </source>
    <source type='B'>
        <name>Mark</name>
        <age>20</age>
    </source>
</sources>

3 个答案:

答案 0 :(得分:4)

变化

<xsl:variable name="x" select="sources/source[@type='C']/$field-name"/>

<xsl:variable name="x" select="sources/source[@type='C']/*[name()=$field-name]"/>

它返回:

Joe

答案 1 :(得分:2)

这里的问题:

select="sources/source[@type='C']/$field-name"

变量$field-name包含字符串,而不是位置路径 - 因此表达式扩展为:

select="sources/source[@type='C']/'name'"

如果您正在使用XSLT 2.0处理器,那么您可能有权访问可以将字符串转换为路径的evaluate()函数,例如: http://www.saxonica.com/documentation9.4-demo/html/extensions/functions/evaluate.html否则你需要使用其他一些方法 - 例如,Joel M. Lamsen在答案中显示的方法。

答案 2 :(得分:0)

我假设您的命名模板想要处理整个文档,然后xslt就像这样......

<xsl:output indent="yes"></xsl:output>

<xsl:template name="get-prefered">
    <xsl:param name="field-name"/> 

    <xsl:variable name="vCondition" select="$field-name/name"/>
    <xsl:variable name="x" select="$field-name/sources/source[@type='C']/name"/>
    <xsl:value-of select="$x"></xsl:value-of>
</xsl:template>

<xsl:template match="/">
    <xsl:call-template name="get-prefered">
        <xsl:with-param name="field-name" select="."></xsl:with-param>
    </xsl:call-template>
    </xsl:template>