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>
在我的对象中有一个元素“过滤器”。 此元素上的值是我希望从中获得每个子项值的元素。
我做错了什么?
例子
<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>