我有以下xslt可以将数据转换为JQuery接受的格式。但是,由于JSON在数据字符串中不接受双引号,因此我需要用转义序列\代替“
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Rowsets>
<Rowset>
<Columns>
<Column Description="Element_1" SQLDataType="12" />
<Column Description="Element_2" SQLDataType="12" />
<Column Description="Element_3" SQLDataType="93" />
</Columns>
<Row>
<Element_1>test_data</Element_1>
<Element_2>test_quo"te</Element_2>
<Element_3>test_data</Element_3>
</Row>
</Rowset>
</Rowsets>
当前的XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
<xsl:output method="text" media-type="text/csv" encoding="UTF-8"/>
<xsl:param name="RowDelim">],</xsl:param>
<xsl:param name="RowLast">]</xsl:param>
<xsl:param name="RowStart">[</xsl:param>
<xsl:param name="startBracket">{ </xsl:param>
<xsl:param name="JQTableData">"aaData": [</xsl:param>
<xsl:param name="JQTableEnd">] }</xsl:param>
<xsl:param name="FieldDelim">,</xsl:param>
<xsl:param name="StringDelim">"</xsl:param>
<xsl:param name="DateFormat">yyyy-MM-dd HH:mm:ss</xsl:param>
<xsl:template match="/">
<xsl:for-each select="Rowsets">
<xsl:for-each select="Rowset">
<xsl:value-of select="$startBracket"/>
<xsl:value-of select="$JQTableData"/>
<xsl:variable name="CurrentColumns" select="Columns"/>
<xsl:for-each select="Columns">
<xsl:for-each select="Column">
<xsl:if test="not(position() = last())">
</xsl:if>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="Row">
<xsl:value-of select="$RowStart"/>
<xsl:for-each select="*">
<xsl:variable name="ColName">
<xsl:value-of select="name(.)"/>
</xsl:variable>
<xsl:variable name="ColType">
<xsl:value-of select="$CurrentColumns/Column[@Name=$ColName]/@SQLDataType"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$ColType= '2' or $ColType= '3' or $ColType= '4' or $ColType= '5' or
$ColType= '6' or $ColType= '7' or $ColType= '8' or $ColType= '-7'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$StringDelim"/>
<xsl:choose>
<xsl:when test="$ColType= '91' or $ColType= '92' or $ColType= '93'">
<xsl:choose>
<xsl:when test=". = 'TimeUnavailable'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test=". = 'true'">
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:when test=". = 'false'">
<xsl:text>N</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$StringDelim"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="not(position() = last())">
<xsl:value-of select="$FieldDelim"/>
</xsl:if>
</xsl:for-each>
<xsl:if test="not(position() = last())">
<xsl:value-of select="$RowDelim"/>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:value-of select="$RowLast"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$JQTableEnd"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
电流输出:
{ "aaData": [["test_data","test_quo"te","test_data"]] }
所需的输出:
{ "aaData": [["test_data","test_quo\"te","test_data"]] }
将此模板添加到您的代码中 :
<xsl:template name="escapeQuote">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) >0">
<xsl:value-of select=
"substring-before(concat($pText, '"'), '"')"/>
<xsl:if test="contains($pText, '"')">
<xsl:text>\"</xsl:text>
<xsl:call-template name="escapeQuote">
<xsl:with-param name="pText" select=
"substring-after($pText, '"')"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
然后更改 :
<xsl:value-of select="."/>
至 :
<xsl:call-template name="escapeQuote"/>
您的完整转换现在变为 :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
<xsl:output method="text" media-type="text/csv" encoding="UTF-8"/>
<xsl:param name="RowDelim">],</xsl:param>
<xsl:param name="RowLast">]</xsl:param>
<xsl:param name="RowStart">[</xsl:param>
<xsl:param name="startBracket">{ </xsl:param>
<xsl:param name="JQTableData">"aaData": [</xsl:param>
<xsl:param name="JQTableEnd">] }</xsl:param>
<xsl:param name="FieldDelim">,</xsl:param>
<xsl:param name="StringDelim">"</xsl:param>
<xsl:param name="DateFormat">yyyy-MM-dd HH:mm:ss</xsl:param>
<xsl:template match="/">
<xsl:for-each select="Rowsets">
<xsl:for-each select="Rowset">
<xsl:value-of select="$startBracket"/>
<xsl:value-of select="$JQTableData"/>
<xsl:variable name="CurrentColumns" select="Columns"/>
<xsl:for-each select="Columns">
<xsl:for-each select="Column">
<xsl:if test="not(position() = last())">
</xsl:if>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="Row">
<xsl:value-of select="$RowStart"/>
<xsl:for-each select="*">
<xsl:variable name="ColName">
<xsl:value-of select="name(.)"/>
</xsl:variable>
<xsl:variable name="ColType">
<xsl:value-of select="$CurrentColumns/Column[@Name=$ColName]/@SQLDataType"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$ColType= '2' or $ColType= '3' or $ColType= '4' or $ColType= '5' or
$ColType= '6' or $ColType= '7' or $ColType= '8' or $ColType= '-7'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$StringDelim"/>
<xsl:choose>
<xsl:when test="$ColType= '91' or $ColType= '92' or $ColType= '93'">
<xsl:choose>
<xsl:when test=". = 'TimeUnavailable'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test=". = 'true'">
<xsl:text>Y</xsl:text>
</xsl:when>
<xsl:when test=". = 'false'">
<xsl:text>N</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="escapeQuote"/>
<!-- <xsl:value-of select="."/> -->
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$StringDelim"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="not(position() = last())">
<xsl:value-of select="$FieldDelim"/>
</xsl:if>
</xsl:for-each>
<xsl:if test="not(position() = last())">
<xsl:value-of select="$RowDelim"/>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:value-of select="$RowLast"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$JQTableEnd"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template name="escapeQuote">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) >0">
<xsl:value-of select=
"substring-before(concat($pText, '"'), '"')"/>
<xsl:if test="contains($pText, '"')">
<xsl:text>\"</xsl:text>
<xsl:call-template name="escapeQuote">
<xsl:with-param name="pText" select=
"substring-after($pText, '"')"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的XML文档时 :
<Rowsets>
<Rowset>
<Columns>
<Column Description="Element_1" SQLDataType="12" />
<Column Description="Element_2" SQLDataType="12" />
<Column Description="Element_3" SQLDataType="93" />
</Columns>
<Row>
<Element_1>test_data</Element_1>
<Element_2>test_quo"te</Element_2>
<Element_3>test_data</Element_3>
</Row>
</Rowset>
</Rowsets>
产生想要的正确结果 :
{ "aaData": [["test_data","test_quo\"te","test_data"]] }
为了澄清,我使用的是XSLT1.0。很抱歉一开始没有具体说明。
问题内容: 因此,我正在编写一个程序,将文本文件分解为单词,然后将列表写入新的文本文件。 我遇到的问题是我需要列表中的字符串使用双引号而不是单引号。 例如 我得到这个当我想这个 这是我的代码 我是python的新手,对此一无所获。有人知道如何解决吗? [编辑:我忘了提及我在arduino项目中使用的输出,该项目要求列表具有双引号。 问题答案: 您无法更改的工作方式。 如何使用用于字符串的JSON格
问题内容: 如何使用PHP 用(我认为其称为单引号)替换(我认为它称为双引号)? 问题答案: 或重新分配
问题内容: 如果JSON字符串如下,如何转义双引号? 我想对值 TEST中 的次级双引号进行转义。 我已经尝试了以下方法,但是它不起作用。 我想念什么? 问题答案: 它应该是: 首先,我将外部引号更改为单引号,因此它们不会与内部引号冲突。然后,我将反斜杠放在最里面的引号之前,以使其转义。而且我避开了反斜杠,以便按字面意义对待它。 使用JSON函数可以获得相同的结果:
本文向大家介绍js 单引号替换成双引号,双引号替换成单引号的实现方法,包括了js 单引号替换成双引号,双引号替换成单引号的实现方法的使用技巧和注意事项,需要的朋友参考一下 1.双引号替换成单引号 2.单引号替换成双引号 以上这篇js 单引号替换成双引号,双引号替换成单引号的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。