我以前从未使用过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>
有人可以建议我如何创建一个函数来应用于“说明”字段,该字段将搜索“说明”字段,并在存在双引号的地方添加前面的双引号,或者用两个双引号替换现有引号? / p>
例如,如果说明字段包含:
I have been told to "Go to site asap"
我想将其替换为:
I have been told to ""Go to site asap""
我已经浏览了这个网站和其他网站,看看是否有我可以使用的东西。我发现很多东西是使用REPLACE函数,我相信它不能用于XSLT 1.0。此外,很多人都建议使用递归模板,但我不知道如何使用它或遵循为它提供的示例。我需要花一些时间来弄清楚,但我有一个截止日期,这意味着我没有更多的时间来试图弄清楚自己。是否可以使用函数来执行此任务?
所有帮助最受赞赏
答案 0 :(得分:1)
因为你已经使用过JScript我假设你可以添加另一个函数
function replace(string, regexPattern, repl) {
return string.replace(new RegExp(regexPattern, 'g'), repl);
}
在JScript部分内,然后执行
<xsl:value-of select="data:replace(string(Instructions), '"', '""')" />