我正在尝试分析一些巨大的字符串,我在XSLT中使用了两种不同的方法(一种称为标记化,另一种名为分析字符串)。
假设我有以下字符串:
var ActivitiesData =
[{"method": {"name": "Bras", "val": "Vegas"},
"laundry": "-<a href="http://www.site.com" target="_blank">OnCase</a>: #9",
"XSD": "true",
"stages": [{"name": "on_site", "DB": "12", "OVL": true, "RVT: "BGD"}, {"name": "on_site", "DB": "12", "OVL": true, "RVT": true}],
"NationalUsage": "Degree",
"Overlay": 32,
"Build_Tick": "12",
"Mozilla": {"Cloud": "Visual", "Decrease": "10"},
"updates": "XXX",
}]
当我试图创建每个数据项时,我的问题就出现了。我的REGEX如下,(.,',\s+"')-这意味着每次a,'匹配时,我都可以区分一个数据和另一个数据。
但是,
在stages数据中,我也有这些字符串(,'),因此我将它们创建为单独的项,而我希望将它们创建成stages的子项-创建一个名为<分期付款>。
也就是说,只有当我看到以以下字符"[{"开头的数据时(就像在阶段中一样),我才想以某种方式将文本(.')重新格式化为其他内容,所以在将来我使用这个标记化字符串(,')时,这些字符串将不匹配。
我希望我能清楚地表达自己,我可能使用了错误的方法。我想得到的最终结果是:
<item>
"method": {"name": "Bras", "val": "Vegas"},
</item>
<item>
"laundry": "-<a href="http://www.site.com" target="_blank">OnCase</a>: #9",
</item>
<item>
"XSD": "true",
</item>
<item>
"stages": [{"name": "on_site", "DB": "12", "OVL": true, "RVT: "BGD"}, {"name": "on_site", "DB": "12", "OVL": true, "RVT": true}],
</item>
..and so on..
这是我在试图捕获这些阶段数据时使用的分析字符串,以便将字符串(,')替换为一些独特的字符串,这些字符串稍后将不会在我的标记化中捕获,并将创建单个元素:
<xsl:variable name="pTokenize">
<xsl:analyze-string select="normalize-space($activitiesDataText)" regex="("stages":[^]]*)">
<xsl:matching-substring>
<xsl:value-of select="replace(regex-group(1), ', '', ',-'')"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="regex-group(1)"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:variable>
非常感谢!
您可以在这里找到一个完全用XSLT2.0为JSON.org/中描述的JSON语法编写的解析器——这不是完整的或官方的JSON语法,所以解析器可能会也可能不会处理您的数据——试一下吧。
您已经给出了一个字符串示例,但还没有向我们展示它的语法。它看起来很像JSON,如果是这样的话,那么它是递归语法,而不是正则语法,这意味着它不能使用正则表达式进行解析。
有很多实用程序可以将JSON转换为XML,包括可以从XSLT调用的实用程序(Saxon有一个解析JSON扩展函数)。或者您可以编写自己的解析器:Dimitre Novatchev有用XSLT编写的复杂解析器的例子,Gunther Rademacher发布了REX,这是一种根据语法的XML描述生成解析器的工具。
我很怀疑,既然你试图用错误的方式来做这件事,那你对解析还相当陌生,在这种情况下,我建议你在进一步研究之前先读一读这个主题。