我的 XML 中有几棵树,想要根据另一棵树的名称来访问其中一棵树。这里被称为tab_name
它是当前节点的父标签,所以我使用 name(..)。如果我在设置变量的同一位置进行测试,这会给我正确的值。
然而,我遇到的问题是,当我引用 $tab_name 下面几行时(在<xsl:when>
tag)名称(..)应用于当前上下文,因此我得到标签“group”而不是我原本期望的标签。
<xsl:variable name="tab_name" select="name(..)"/>
<legend>
<xsl:for-each select="/snap/page/body/client/group/*">
<xsl:choose>
<xsl:when test="name(.) = $tab_name"> <!-- $tab_name = 'group' here! -->
...
</xsl:when>
</xsl:choose>
</xsl:for-each>
</legend>
这是 XSLT 2.0 的正常/预期行为吗?我认为该变量将在其自己的 for-each 上下文中设置(for-each 此处未显示),而不是新的子 for-each 上下文中。
这里有完整的 XSLT 和 XML 文档,用于重现 xmlpatterns(Qt XML 解析器)的问题。
XSLT(例如 a.xsl):
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:snap="snap:snap">
<xsl:template match="snap">
<xsl:for-each select="page/body/client/data_field/*">
Direct name = <xsl:value-of select="name(.)"/> [correct, getting 'dog']
<xsl:for-each select="*">
<xsl:variable name="tab_name" select="name(..)"/>
Parent name = <xsl:value-of select="$tab_name"/> [correct, getting 'dog']
<xsl:message>Message has no side-effects... <xsl:value-of select="$tab_name"/></xsl:message>
<xsl:for-each select="/snap/page/body/client/group">
Inside other for-each tab_name = <xsl:value-of select="$tab_name"/> [incorrect, getting 'client']
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<!-- vim: ts=2 sw=2
-->
XML(例如a.xml):
<!DOCTYPE snap>
<snap>
<page>
<body layout-name="finball">
<client>
<group>
<cat>Jolly</cat>
<dog>Bear</dog>
</group>
<data_field>
<cat>
<div>All about Cats</div>
</cat>
<dog>
<div>All about Dogs</div>
</dog>
</data_field>
</client>
</body>
</page>
</snap>
<!--
vim: ts=2 sw=2 et
-->
我用来重现问题的命令:
xmlpatterns a.xsl a.xml
输出不正确:
Direct name = cat [correct, getting 'cat']
Parent name = cat [correct, getting 'cat']
Inside other for-each tab_name = client [incorrect, getting 'client']
Direct name = dog [correct, getting 'dog']
Parent name = dog [correct, getting 'dog']
Inside other for-each tab_name = client [incorrect, getting 'client']
(详细说明:我正在使用 Qt XSTL 2.0 实现,如果它不正常,那么 Qt 实现就是损坏的。)