【问题标题】:Replace single quote " with double quote "" using XSLT 1.0使用 XSLT 1.0 将单引号 " 替换为双引号 ""
【发布时间】:2015-11-16 13:06:06
【问题描述】:

我以前从未使用过 XML/XSLT/JScript,现在正在快速学习。

我正在使用 XSLT 1.0 和 XML 创建一个 CSV 文件。我有以下代码,由目前无法提供帮助的外部软件开发人员创建,除了一个问题外,它工作正常并且按要求执行。我需要用双引号字符“”替换所有出现的单引号字符“”,以确保引号字符的正确转义。

>   <?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.maxima.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[
function convertDate(dt)
  {     
    var yy = dt.substr(6, 2);
    var mm = dt.substr(3, 2);
    var dd = dt.substr(0, 2);
    var ret = "20"+yy+mm+dd;

    return ret.toString();  
  }    

  function convertTime(dt)
  {     
    var ss = dt.substr(6, 2);
    var mm = dt.substr(3, 2);
    var hh = dt.substr(0, 2);
    var ret = hh+mm+ss;

    return ret.toString();  
  }

  function IncidentType(fault)
  {
    var type = fault.substr(0,2);
    if (type == "PM")
      {
      var ret = "MAINTENANCE";
      }
      else
      {
      var ret = "CALLOUT";
      }

    return ret;                           
  }


]]> 
</msxsl:script>
 <xsl:template match="/">
<xsl:apply-templates select="Visit" /> 
</xsl:template>
 <xsl:template match="/Visit/MxmServCallVisit">

"Incident_ID","Incident_Type","Created_Date","Created_Time","Notes"
" 
<xsl:value-of select="./JobId" /> 
"," 
<xsl:value-of select="data:IncidentType(string(./MxmServCall/FaultId))" /> 
"," 
<xsl:value-of select="data:convertDate(string(./MxmServCall/LoggedDate))" /> 
"," 
<xsl:value-of select="data:convertTime(string(./MxmServCall/LoggedTime))" /> 
"," 
<xsl:value-of select="./Instructions" /> 
" 
</xsl:template>
</xsl:stylesheet>

有人可以建议我如何创建一个应用于“说明”字段的函数,该函数将在“说明”字段中进行搜索,并在存在双引号的地方添加前面的双引号,或者用两个双引号替换现有的引号?

例如,如果说明字段包含:

I have been told to "Go to site asap"

我想将其替换为:

I have been told to ""Go to site asap""

我已经浏览了这个网站和其他网站,看看是否有我可以使用的东西。我发现很多唯一的事情是使用我认为不能与 XSLT 1.0 一起使用的 REPLACE 函数。此外,很多人建议使用递归模板,但我不知道如何使用它或遵循为它提供的示例。我需要花一些时间来弄明白,但我有一个截止日期,这意味着我没有更多时间自己去弄明白。是否可以使用函数来执行此任务?

非常感谢所有帮助

【问题讨论】:

  • 提醒一下 - 避免从 MSIE(或大多数 Web 浏览器)复制 XML,因为它会在记录前添加 -,在这种情况下会使您的样式表无效。
  • 哎呀,对不起。我在那里看到了它们,但不确定它们是否是样式表的一部分。我现在已经删除了它们。干杯!

标签: xml xslt


【解决方案1】:

既然您已经使用 JScript,我假设您可以添加另一个函数

function replace(string, regexPattern, repl) {
  return string.replace(new RegExp(regexPattern, 'g'), repl);
}

在 JScript 部分中,然后执行

<xsl:value-of select="data:replace(string(Instructions), '&quot;', '&quot;&quot;')" />

【讨论】:

  • 嗨@Martin 我已经尝试过你建议的代码。这儿存在一个问题。只有第一次出现的引号被字符串中的双引号替换。例如,如果我的原始字符串是:test quote "quoted text", "blah blah", "," 我希望它返回为:test quote ""quoted text"", ""blah blah"", "","" 但是,我得到以下信息:test quote ""quoted text", "blah blah", "," 你有什么进一步的建议吗?非常感谢您的帮助
  • 我已经编辑了 JScript 代码以显式构造一个带有 g 标志的 RegExp 对象,用于全局搜索/替换,希望能解决问题。
  • 非常感谢@Martin,太棒了!!
猜你喜欢
  • 2015-08-01
  • 2018-11-18
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多