在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常?

2024-01-28

我的 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 实现就是损坏的。)


这显然是一个错误Qt XSLT 2.0 处理器 http://qt-project.org/doc/qt-4.8/xmlprocessing.html。他们在他们的网站上声称他们只部分支持 XSLT 2.0。然而,这种分配变量的行为在1.0和2.0之间并没有改变。

“在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常?”

是的,“在使用时”计算是正常的,以防止不必要的开销。大多数处理器(包括我们的 http://exselt.net,在大多数情况下),只会在使用时计算一次变量。但是,它们必须根据其声明上下文进行计算,这显然不是这里发生的情况:

变量的声明定义了它的焦点和上下文,而不是引用变量的地方。

当我运行您的输入 XML 和样式表 XSLT 时Saxon http://saxonica.com or Exselt http://exselt.net(或者可能是我没有尝试过的任何其他处理器),它给出以下输出(为了清楚起见,删除了缩进和白线):

<?xml version="1.0" encoding="UTF-8"?>
Direct name = cat [correct, getting 'dog']
    Parent name = cat [correct, getting 'dog']
        Inside other for-each tab_name = cat [incorrect, getting 'client']
Direct name = dog [correct, getting 'dog']
    Parent name = dog [correct, getting 'dog']
        Inside other for-each tab_name = dog [incorrect, getting 'client']

正如您所看到的,它要么总是“狗”,要么总是“猫”,正如它应该的那样。

我建议你提交了一个错误 http://qt-project.org/wiki/ReportingBugsInQt反对这个处理器,或者考虑到它是开源的,如果你有时间,帮助他们修复 https://bugreports.qt-project.org/issues/?filter=10568它在源头;)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常? 的相关文章

随机推荐

  • 在 Spark 中保存有序数据帧

    我正在尝试将有序数据帧保存到 HDFS 中 我的代码如下所示 dataFrame orderBy index write mode SaveMode Overwrite parquet getPath 我在两个不同的集群上运行相同的代码 一
  • 如何在 PHPUnit 测试中显示底层测试方法?

    我有测试套件 里面有很多测试 这是一个中等大小的 ok 4 CommodityBasketTest testStartsOutEmpty ok 5 CommodityBasketTest testCanAddACommodity ok 6
  • 为什么不应该使用 F# 异步工作流程来实现并行性?

    我最近一直在学习 F 对其轻松利用数据并行性特别感兴趣 这data gt Array map gt Async Parallel gt Async RunSynchronously习语似乎很容易理解 易于使用并从中获得真正的价值 那么为什么
  • 如何将 git 存储库设置为只读?

    我有一些通过 SSH 远程访问的 git 存储库 我想将其中一些设置为只读以防止更多推送 有些人有指向这些存储库的遥控器 这些裸存储库已初始化 shared group 那么将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问
  • 如何在 python 中转义正斜杠,以便 open() 将我的文件视为要写入的文件名,而不是要读取的文件路径?

    让我先说我是不太确定我的代码发生了什么 我对编程相当陌生 我一直在为我的 python CS 课程创建一个单独的最终项目 该项目每天检查我老师的网站 并确定自上次程序运行以来他是否更改了他网站上的任何网页 我现在正在执行的步骤如下 def
  • 如何解决Sonar错误:无法加载组件类org.sonar.scanner.scan.ProjectLock

    我在 netbeans 项目上运行 Sonar 时遇到一些问题 它不起作用 我有以下错误 C Users remy fischer Desktop NetBeansProjects NetBeansProjects BinPacking s
  • Xcode 项目在文档大纲中显示为灰色

    我一直在使用 iCloud 将我正在处理的 Xcode 项目从笔记本电脑 同步 到桌面 不幸的是 它似乎运作得不太好 我今天在台式机上打开了一个昨天在笔记本电脑上工作的项目 If I open the file on the desktop
  • 使用 jQuery 获取 ListBox 中选定项目的数量

    如主题中所述 当用户选择新项目时 如何使用 jQuery 获取 ListBox 中选定项目的计数 我有这些代码 Html ListBoxFor x gt Model StatesID Model States new class chzn
  • 十进制小时变成时间?

    我在数据库中有一个小时字段 例如 1 4 1 5 1 7 我需要将其转换回 HH MM 做到这一点最简单的方法是什么 TimeSpan FromHours http msdn microsoft com en us library syst
  • HttpSessionListener 不起作用

    我已经实现了 HttpSessionListiner 但它不起作用 用调试器检查 输入 servlet 后创建新会话 登录后 JSESSION ID 发生变化 但 session getCreateTime 保持不变 会话保持不变 使用注释
  • Erlang集群

    我正在尝试使用 Erlang 作为将所有组件粘合在一起的粘合剂来实现一个集群 我喜欢它创建一个完全连接的节点图的想法 但在在线阅读不同的文章后 似乎这不能很好地扩展 最多有 50 100 个节点 OTP 的开发者是否故意施加此限制 我确实知
  • 调用未定义函数curl_file_create() [文件处理]

    我正在尝试使用curl上传文件 在PHP文档中它说 要发布文件 请在文件名前面添加 并使用完整路径 可以通过在文件名后面加上格式为 type mimetype 的类型来显式指定文件类型 此参数可以作为 urlencoded 字符串 如 pa
  • FBSDK 登录错误代码:Objective-C 中的 308

    我不断得到 Error Domain com facebook sdk login Code 308 操作无法 完成 com facebook sdk login 错误 308 尝试从我的设备登录 Facebook 时 我的代码可以在模拟器
  • WebKit 及其遗留前缀

    我正在尝试编译特性前缀为 apple and khtml WebKit 支持哪些and since 哪个版本它们最终被放弃或引入 他们受到什么限制 例如 您可以在以下位置找到它们吗 document body style 我猜只有像记者这样
  • 共同好友数量最多的好友

    我想找到我与他们共同好友数量最多的朋友 我尝试使用 FQL 和图形 API 按以下方式执行此操作 获取当前登录用户的好友列表 FQL SELECT uid1 FROM friend WHERE uid2 MY USER ID and uid
  • Cin 无需等待输入?

    对于我正在开发的项目 我需要程序能够接收用户的输入 但是当他们输入某些内容时 程序可以继续循环 For example while true if userInput true cin gt gt input DO SOMETHING 这意
  • 标记数据和未标记数据有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 In this http www youtube com watch v qkcFRr7LqAw在 Sebastian Thrum 的视频
  • 我可以在以后的版本中更改 Android 应用程序图标和名称吗?

    这在某种程度上听起来很愚蠢 但我想知道是否可以在后续版本中更改应用程序徽标 图标 和 Android 名称 比如说 今天我在 Android 市场上推送我的应用程序 明天我想更改徽标 图标 我知道我 不应该 这样做 但是可以这样做吗 另外
  • 使用 OpenVPN 创建 VPN

    我在 Android 10 上连接 VPN 时遇到问题 并在 logcat 中收到以下消息 这是权限错误 寻找解决方案 还在 Mainfest 中添加了 android requestLegacyExternalStorage true 但
  • 在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常?

    我的 XML 中有几棵树 想要根据另一棵树的名称来访问其中一棵树 这里被称为tab name它是当前节点的父标签 所以我使用 name 如果我在设置变量的同一位置进行测试 这会给我正确的值 然而 我遇到的问题是 当我引用 tab name