如何声明然后在 CDATA 块中使用变量?

Posted

技术标签:

【中文标题】如何声明然后在 CDATA 块中使用变量?【英文标题】:How do I declare then use a variable within a CDATA block? 【发布时间】:2021-01-02 01:57:03 【问题描述】:

我有一个 XSL/XML/JS 文件。它是由一个不再在这里工作的人写的,我通常只处理 SQL,所以我不知道如何实现我需要做的事情

我正在尝试将一些变量添加到现有 CDATA 块中的文件中。然后我在函数中使用变量。但是,我尝试了以下方法和变体,但在应用程序(Dynamics AX)中不断出现语法错误。我是否在这里做一些明显错误的事情,无论是我如何声明变量或我如何使用它们?这些是我所做的唯一更改,没有这些更改就没有语法或任何其他问题/错误。

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:mxm="http://schemas.microsoft.com/dynamics/2008/01/documents/MxmServInterfaceOutboundAif" 
xmlns:data="http://www.example.com/data" exclude-result-prefixes="xs xsi xsl">
  <xsl:output method="text" encoding="UTF-8" indent="no" />   
    <msxsl:script language="JScript" implements-prefix="data">    
        <![CDATA[      
      
      //Minor Repairs email address  
      var MinorsEmail = xxx@domain.com
      //Service Dept email address
      var ServiceEmail = yyy@domain.com
      //Major Repairs email address  
      var MajorsEmail = zzz@domain.com

//Select appropriate email to use
function EmailFrom(fault)
      
        var type = fault.substr(0,2);
        if (type == "MI")
          
          var ret = MinorsEmail;
          
        else 
          
          var ret = concat(ServiceEmail, "; ",MajorsEmail);
          
        return ret; 
      

编辑:在变量值周围添加引号已经解决了部分问题。现在的问题是 CONCAT 没有按预期运行。我现在收到以下错误:

Variable concat has not been declared

【问题讨论】:

如果这些电子邮件地址应该是 javascript 字符串,则可以引用您的字符串值。 您能否edit 提问以添加有关如何在 Dynamics AX 中使用此 xml 文件的信息?我很惊讶为什么文件原样不会产生任何问题,因为 CDATA 块中的代码无效x++ 代码而且我不知道 AX 2009 应该如何执行 Java Script(或者它是 JScript?)代码. 感谢@MartinHonnen 在字符串值中添加引号已解决部分问题。我现在唯一的问题是功能。如果 ELSE 适用,则 CONCAT 不起作用 - 我收到错误消息“未声明变量 concat”。有什么想法吗? 嗨@FH-Inway,您可以在基本 - 设置 - 应用程序集成框架 - XSLT 存储库中添加 XSL 转换。是这个意思吗? JavaScript 中的字符串连接是通过 + 运算符 ServiceEmail + "; " + MajorsEmail 完成的 【参考方案1】:

感谢@Martin Honnen,答案是为变量值添加引号,并使用 + 代替 CONCAT:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:mxm="http://schemas.microsoft.com/dynamics/2008/01/documents/MxmServInterfaceOutboundAif" 
xmlns:data="http://www.example.com/data" exclude-result-prefixes="xs xsi xsl">
  <xsl:output method="text" encoding="UTF-8" indent="no" />   
    <msxsl:script language="JScript" implements-prefix="data">    
        <![CDATA[      
      
      //Minor Repairs email address  
      var MinorsEmail = "xxx@domain.com"
      //Service Dept email address
      var ServiceEmail = "yyy@domain.com"
      //Major Repairs email address  
      var MajorsEmail = "zzz@domain.com"

//Select appropriate email to use
function EmailFrom(fault)
      
        var type = fault.substr(0,2);
        if (type == "MI")
          
          var ret = MinorsEmail;
          
        else 
          
          var ret = ServiceEmail + "; " + MajorsEmail;
          
        return ret; 
      

【讨论】:

以上是关于如何声明然后在 CDATA 块中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 case 块中声明变量时,C++11 未正确执行 switch

java变量类型

Java中final关键字如何使用?

Java中final关键字如何使用?

如何检查 `let` 变量是不是已在 ES6 上声明?

在 Oracle SQL 的功能块中声明数字变量时出错