【问题标题】:VSCode resolve variable cannot be resolved error in editor for *.xsl*.xsl 的编辑器中的 VSCode 解析变量无法解析错误
【发布时间】:2022-11-12 17:23:39
【问题描述】:

我正在使用 VSCode 应用程序开发 *.xsl 文件。

我正在使用一个 *.xsl 文件,其中包含我在整个项目中使用的全局变量,并将其包含在其他文件中。但是,仅在运行时间接导入时,VSCode 会将这些参数/变量突出显示为缺少引用。

这可以在 VSCode 编辑器中解决以在查找参考时在项目设置中包含其他文件吗?


例子:

文件A

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
<xsl:include href="./fileB.xsl"/>
<xsl:include href="./fileC.xsl"/>

<xsl:variable name="varA">Variable directly defined in file A</xsl:variable>

<xsl:value-of select="$varA"/> <!-- directly available -->
<xsl:value-of select="$varB"/> <!-- include works at runtime at in UI -->
<xsl:value-of select="$varC"/> <!-- include works at runtime at in UI -->

</xsl:stylesheet>

文件B

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

<xsl:variable name="varB">Variable defined in other file B</xsl:variable>

<xsl:value-of select="$varB"/> <!-- directly available -->
<xsl:value-of select="$varC"/>  <!-- include works at runtime, but error in UI -->

</xsl:stylesheet>

文件C

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

<xsl:variable name="varC">Variable defined in other file C</xsl:variable>

<xsl:value-of select="$varC"/> <!-- directly available -->

</xsl:stylesheet>

子/文件D

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

<xsl:variable name="varD">Variable defined in other file D in sub dir</xsl:variable>

<xsl:value-of select="$varD"/> <!-- directly available -->

</xsl:stylesheet>

文件A

  • 定义varA
  • 包括文件 B 和 C
  • 不包括文件 D
  • 可以在运行时和 UI 中解析自己的变量 varA 以及包含文件 varBvarC 中的变量

文件B

  • 定义varB
  • 可以解析自己的变量varB
  • 不包括文件 C(明确)
  • 可以在运行时解析varC,因为包含在 fileA 中,但不在 UI 中(警告)

文件C

  • 定义varC
  • 可以解析自己的变量varC

子/文件C

  • 定义varD
  • 可以解析自己的变量varD

所以 fileA 包含文件 B+C 并且可以在运行时解析所有变量并且在 UI 中没有警告。 sub/fileD 不直接包含,但可以在子目录中找到,因此 UI 会警告“XPath: 变量/参数...这里无法解析,但可以在外部模块中定义"

FileB 尝试解析 varC,但不包含 fileC。运行时由fileA解析,包括fileB和fileC,所以运行时不会报错。但是 UI 找不到 varC 并将其标记为“XPath:变量/参数 $varA 无法解析"

您可能会问为什么不简单地在 fileB 中包含 fileC 来解决它!?原因是,我支持不同的语言。因此根 *.xsl 文件根据语言设置导入不同的文件。每个语言 *.xsl 在给定语言中定义相同的变量。模板使用公共变量以给定语言显示文本。因此,我在运行时依赖根导入。

我能否以某种方式告诉 UI,这些变量存在,即使该文件不包含在内?喜欢将其添加到项目设置等中吗?

【问题讨论】:

    标签: visual-studio-code xslt reference


    【解决方案1】:

    在这里,我假设您将 DeltaXML's XSLT/XPath extension 用于 VSCode(我维护):

    在您的示例中,fileA.xslfileB.xslfileC.xsl 是唯一引用外部定义变量的文件(XSLT 模块)。所以我们可以放心地忽略sub/fileD.xsl

    当前行为:

    • 如果你先打开fileB.xsl
      • $varB$varC的引用不是已解决,因为它在 fileA.xsl 中定义
    • 如果你先打开fileA.xsl
      • $varB$varC 的外部引用被解析,因为xsl:include 指令导致VSCode 加载在fileB.xslfileC.xsl 中定义的所有符号
    • 如果你打开fileB.xsl开张fileA.xsl:
      • $varB$varC 的外部引用已解决 - 当您打开fileA.xsl 时,存储了fileA.xsl 包含的fileB.xslfileC.xsl 的信息

    答案:

    要获得您需要的行为(从fileB.xsl 解析$varC),如果您先打开fileB.xsl,您只需返回并打开fileA.xsl

    笔记: 在此之后,您可能需要通过关闭/重新打开 VSCode 来“刷新”fileB.xsl

    VSCode 与查看参考资料fileB.xsl 中的 $varC 引用调用


    最后一点:

    诚然,这种行为不是无缝的,但这确实意味着不需要拥有需要维护和与他人共享的专有项目设置。有一些关于 XSLT 4.0 的提议可能会很有趣,以提供一种以标准方式解决此问题的方法。

    【讨论】:

    • 在上面的屏幕截图中,我逐字复制了“fileB.xsl”,因此您会看到xsl:value-of 被标记为带有“红色波浪”的错误。这是因为 'xsl:value-of' 在 XSLT 中无效。 - 关键点是 $varB 和 $varB 引用没有被标记为错误。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2015-01-31
    • 2019-06-18
    • 2017-01-22
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多