我正在尝试分析一些巨大的字符串,我在XSLT中使用了两种不同的方法(一种叫做tokenize,另一种叫做analyze string) .
假设我有以下字符串:
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,'匹配时,我可以区分一个数据到另一个数据 .
但,
在阶段数据我也有这些字符串(,'),因此我将它们创建为单独的项目,而我想创建它们作为阶段的子项 - 创建一个名为<stage-itmes>的特殊项目元素 .
也就是说,只有当我看到以下列字符开头的数据“[{”(就像分阶段一样)时,我想以某种方式将文本( . ')重新格式化为其他内容,以便将来我将使用此标记化字符串时(,')这些字符串不匹配 .
我希望我能够清楚地表达自己,我可能会用错误的方法去做 . 我想得到的最终结果是:
<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>
非常感谢你!
2 回答
You can find here a parser written completely in XSLT 2.0 for the JSON grammar as described in json.org - 这不是完整或官方的JSON语法,因此解析器可能会或可能不会处理您的数据 - 只需尝试一下即可 .
你给了一个示例字符串,但你没有向我们展示它的语法 . 它看起来非常像JSON,如果是这种情况,那么它是一个递归语法而不是常规语法,这意味着它无法使用正则表达式进行解析 .
有很多实用程序可以将JSON转换为XML,包括可以从XSLT调用的实用程序(Saxon有一个parse-json扩展函数) . 或者您可以编写自己的解析器:Dimitre Novatchev有使用XSLT编写的复杂解析器的示例,Gunther Rademacher发布REX,这是一种从XML语法描述生成解析器的工具 .
我很怀疑,因为你试图以错误的方式做到这一点,你是一个新的解析,在这种情况下,我会建议在进一步探讨之前阅读这个主题 .