我正在尝试分析一些巨大的字符串,我在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,'匹配时,我可以区分一个数据到另一个数据。
,但
在阶段数据中我也有这些字符串(,'),因此我将它们创建为单独的项目,而我想将它们创建为阶段的子项 - 创建一个名为&lt; stage-itmes&gt;的特殊项目元素。
也就是说,只有当我看到以下列字符开头的数据“[{”(就像分阶段一样)时,我想以某种方式将文本(。')重新格式化为其他东西,这样以后我将会使用这个标记化字符串(,')这些字符串将不匹配。
我希望我能够清楚地表达自己,我可能会用错误的方法来做到这一点。我想得到的最终结果是:
<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..
这是我在尝试捕获这些阶段数据时使用的分析字符串,以便将字符串(,')替换为以后不会在我的标记化中捕获并且将创建单个元素的唯一字符:< / p>
<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>
非常感谢!
答案 0 :(得分:1)
你已经给出了一个示例字符串,但是你还没有向我们展示它的语法。它看起来非常像JSON,如果是这样,那么它是一个递归语法而不是常规语法,这意味着它不能使用正则表达式进行解析。
有很多实用程序可以将JSON转换为XML,包括可以从XSLT调用的实用程序(Saxon有一个parse-json扩展函数)。或者您可以编写自己的解析器:Dimitre Novatchev有使用XSLT编写的复杂解析器的示例,Gunther Rademacher发布了REX,这是一种从XML语法描述生成解析器的工具。
我很怀疑,因为你试图以错误的方式做到这一点,因为你对解析很陌生,在这种情况下,我会建议你继续阅读这个主题。
答案 1 :(得分:1)
你可以找到here一个完全用XSLT 2.0编写的解析器,用于JSON语法,如json.org所述 - 这不是完整或官方的JSON语法,所以解析器可能会或可能不会处理您的数据 - 只需尝试一下。