无法在 XSLT 2.0 中的匹配 XPath 表达式中使用模板参数?

2024-03-08

根据this https://stackoverflow.com/questions/6117460/xsl-how-to-use-parameter-inside-match/6119012?noredirect=1#comment80194907_6119012所以问题应该可以在 XPath 表达式中使用参数match。但是,如果xsl:param of a xsl:template是在同一个模板中使用。

我的 XML 文件如下所示

<?xml version="1.0" encoding="UTF-8"?>
<myRoot>
    <myNode myAttribute="3">
        <myChildAttribute myChildAttribute="a" />
    </myNode>
    <myNode myAttribute="2">
        <myChildAttribute myChildAttribute="b" />
    </myNode>
    <myNode myAttribute="1" />
</myRoot>

和我的 XSL 文件一样。

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

    <xsl:template match="myRoot">
        <xsl:apply-templates select="myNode">
            <xsl:sort select="@myAttribute" />
            <xsl:with-param name="myParam" select="max(myNode/@myAttribute)" />
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="myNode[node() and @myAttribute = $myParam]">
        <xsl:param name="myParam" />
            <xsl:for-each select="myChildAttribute">
INSERT INTO a(b) VALUES ('<xsl:value-of select="@myChildAttribute" />');
            </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

不幸的是,当使用 SAXON 9HE 运行时,会出现以下错误

XPST0008: Variable myParam has not been declared (or its declaration is not in scope)

是否无法在 match-XPath 表达式中使用模板的参数the same模板!?


是不是不能使用模板的参数 同一模板的匹配 XPath 表达式!?

不可以,当选择模板执行时,模板匹配表达式中的任何变量/参数都必须在范围内(定义/可见)。

由于模板是 XSLT 指令(在全局级别定义),因此范围内(它们可以看到)的唯一变量/参数是全局级别变量/参数。

模板的参数仅在选择执行模板之后才会传递给它,而不是在此之前。这意味着在执行模板选择过程时,该参数的值不存在。

因此,如果要在执行过程的模板选择中使用非全局表达式,则需要在select对应的属性xsl:apply-templates指令,可以在其中计算该表达式——而不是在match模板的属性,其中无法计算此表达式。

为了清楚起见,下面的代码纠正了所提供代码中的问题:

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

        <xsl:template match="myRoot">
            <xsl:apply-templates select="myNode[@myAttribute = max(../myNode/@myAttribute)]">
                <xsl:sort select="@myAttribute" />
            </xsl:apply-templates>
        </xsl:template>

    <xsl:template match="myNode[node()]">
             <xsl:for-each select="myChildAttribute">
INSERT INTO a(b) VALUES ('<xsl:value-of select="@myChildAttribute" />');
            </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<myRoot>
    <myNode myAttribute="3">
        <myChildAttribute myChildAttribute="a" />
    </myNode>
    <myNode myAttribute="2">
        <myChildAttribute myChildAttribute="b" />
    </myNode>
    <myNode myAttribute="1" />
</myRoot>

没有产生错误,这是转换的输出(我不能说“正确的输出”,因为没有定义任何要求,因此无法验证它们。而且我对此代码持保留态度:例如使用<xsl:sort>的孩子xsl:apply-templates没有意义,因为它将对相等( max() )值进行排序,并且对相等值序列进行排序会产生相同的序列):

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

无法在 XSLT 2.0 中的匹配 XPath 表达式中使用模板参数? 的相关文章

随机推荐

  • 将文本列表格式化为列

    我正在尝试将字符串值列表输出为 2 列格式 将字符串列表制作为 普通文本 的标准方法是使用字符串连接方法 但是 它只需要 2 个参数 因此我只能使用 n 创建一个列 我认为尝试创建一个循环 只需在列之间添加一个选项卡就可以做到这一点 但逻辑
  • 如何在sbt项目中声明对Scalding的依赖?

    我想弄清楚如何创建一个build sbt为我自己的文件Scalding https github com twitter scalding为基础的项目 烫源结构无build sbt文件 相反 它有project Build scala构建定
  • 无法安装Python和GDAL(DLL加载失败)

    我正在尝试在我的 Windows 7 工作站上安装 GDAL 和 Python Python 版本 2 6 6 Gdal 1 8 视觉 Visual C Studio 2010 Express 我按照以下说明进行操作http ucsb pb
  • 欺骗 IP 地址以使用 Sitecore 8 测试 GEOIP 查找

    我是 Sitecore 的新手 我正在尝试实现以下流程类来覆盖GeoIP用于测试目的的值 我找不到在哪个名称空间Tracker 类位于 请注意 我正在使用站点核心 8托管在本地主机上 Sitecore 博客 sitecorejohn 博客
  • 通过 Python winreg 在注册表中设置 Windows 系统路径

    我编写了一个程序 通过注册表将目录添加到 PATH 变量 HKCU 用户 或 HKLM 系统 路径 具体取决于输入选项 使用用户路径时效果很好 但是 当设置系统路径时 Windows 会认为路径变量为空 例如 notepad is not
  • 无法重现:C++ Vector 性能优于 C# List 性能

    在 Microsoft 的 BUILD 会议上 Herb Sutter 解释说 C 有 真实数组 而 C Java 语言没有相同或类似的东西 我被卖了 您可以在这里观看完整的演讲http channel9 msdn com Events B
  • SimpMessagingTemplate 与 MessageSendingOperations

    我刚刚开始研究 Spring 4 stomp over websocket 这两者有什么区别 我应该使用哪种情况而不是另一种情况 没有区别 MessageSendingOperations是一个接口 契约 SimpMessagingTemp
  • .NET 反射的成本有多高?

    我经常听说反射的使用有多么糟糕 虽然我通常会避免反思 并且很少发现没有反思就无法解决问题的情况 但我想知道 对于那些在应用程序中使用反射的人来说 您是否测量过性能影响 它真的有那么糟糕吗 在他的演讲中日常事物的表现 http weblogs
  • 在回流中,我如何从asp.net web api获取数据

    我正在使用reactjs的回流 从Store的回流动作中 我编写了一个动作来从asp net web api获取数据 我认为这只是获取使用ajax的数据的唯一方法 有人跟我说 我可以使用插件jquery获取数据 但我不这样做不要相信它 因为
  • 如何使用selenium python动态单击加载按钮?

    我想点击装载更多直到它消失在该页面上 我已经尝试过 但有时会起作用或出现错误 我所做的并不是完美的解决方案 我可以有列表中的多个 url并一一击打装载更多直到它从该页面消失 预先感谢您的帮助 Code driver webdriver Fi
  • FormsAuthenticationTicket 无法在服务器端失效。引发cookie回复攻击

    我有一个使用表单成员身份验证的 ASP NET Web 应用程序 我们最近进行了渗透测试 发现的一个问题是窃取用户帐户的能力 如果在注销之前从用户复制了 ASPXAUTH cookie 值 则用户可以以其他用户身份登录 编辑其 cookie
  • Scrapy 1.1.0 - 没有活动项目

    我是Python新手 成功安装了Scrapy 在eclipse中使用PyDev 当我运行程序时 它显示如下 如图所示 我正在运行这段代码 import scrapy class DmozSpider scrapy Spider name d
  • 修复 html 中未封闭的标签或使用 HTML 解析器进行解析以进行 XSLT 转换

    我有一些 HTML 代码 它们是 XSLT 转换的结果 XML gt HTML 我想对结果 HTML 运行另一个 XSLT 转换 HTML gt HTML 我的问题是 第一次转换可能会返回未封闭的标签 例如 img 这意味着我无法使用 Do
  • 在 Twitter 完成块中推送 UIViewController 需要大量时间

    当运行这段代码时 IBAction loginWithTwitter id sender NSLog Logging in with twitter ACAccountStore accountStore ACAccountStore al
  • 使用 jquery 获取 div 中的下一个元素

    假设我们有这个 html 代码 div h2 Title h2 p lorem ipsum p div 还有这个 jQuery test h2 text Changed Title 现在继续下去的正确方法是什么 p 并且还可以更改其文本 而
  • 无法为华为 Android Logcat 启用 DEBUG 和 VERBOSE

    我有华为nova Plus http consumer huawei com en mobile phones novaplus index htm我刚刚发现华为在其Android日志中只显示起始日志级别INFO 我当然需要DEBUG VE
  • 我需要一些关于 MVC 架构和三层架构的澄清

    我一直在读 Pro ASP NET MVC Framework 一书 我对很多事情感到非常困惑 我一直在尝试做一些研究 但我发现有这么多不同的方法和概念向我抛出 这只会让事情变得更糟 所以我有几个问题 我知道 MVC 应该将功能分为三个主要
  • 使用 ArcGIS 安装的 Python 2.7 安装 pip

    我正在尝试在 Windows 8 1 上安装 Scrapy for Python 2 7 我知道我首先需要安装 pip 由于我通过ArcGIS 10 2安装了Python 我认为我需要在C Python27 ArcGIS10 2 lib s
  • eclipse 错误:glassfish\domains\domain1 不存在

    我有 java ee6 web profile sdk 我正在使用 eclipse ee 我使用 Eclipse 安装了 Glassfish 插件下载附加服务器适配器 in the 新服务器向导 现在在构建测试应用程序期间 Eclipse
  • 无法在 XSLT 2.0 中的匹配 XPath 表达式中使用模板参数?

    根据this https stackoverflow com questions 6117460 xsl how to use parameter inside match 6119012 noredirect 1 comment80194