XSL 通过另一个元素值获取元素值

XSL get element value by another element value

在我的对象中有一个元素“过滤器”。 此元素上的值是我希望从中获得每个子项值的元素。

我做错了什么?

例子

<object>
    <name>hello</name>
    <filter>height</filter>
    <childs>
        <child>
            <width>10</width>
            <height>20</height>
            <weight>30</weight>
        </child>
    </childs>
</object>

我尝试了以下但无法获得要返回的值 (20):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
    <xsl:output method="text" />
    <xsl:template match="/">

        <!-- filter element name -->
        <xsl:variable name="filter" select="object/filter" />

        <xsl:for-each select="childs/child">
            <!-- i want to return the value (20) -->
            <xsl:value-of select="*[local-name()=$filter]" />
        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

非常感谢您的宝贵时间。

您的代码包含错误的上下文节点。尝试以下操作:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
    <xsl:output method="text" />

    <xsl:template match="/">
        <xsl:variable name="filter" select="object/filter" />
        <xsl:for-each select="object/childs/child">
            <!-- i want to return the value (20) -->
            <xsl:value-of select="*[local-name()=$filter]" />
        </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>

它的输出是20.

或者更简单。

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="/object">
        <!-- filter element name -->
        <xsl:variable name="filter" select="filter"/>

        <xsl:for-each select="childs/child">
            <!-- i want to return the value (20) -->
            <xsl:value-of select="*[local-name()=$filter]"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

XSLT 有一个内置的 key 机制来解析交叉引用。我强烈推荐使用它:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:key name="elem-by-name" match="child/*" use="local-name()" />
    
<xsl:template match="/object">
    <xsl:value-of select="key('elem-by-name', filter)" />
</xsl:template>

</xsl:stylesheet>