2012-01-03 75 views
0

我面临的问题是我在XML中有一个字符串的节点,代表HTML。 我需要削减该字符串,但是,当然,这可能导致在invalide HTML的标记(例如,如果我切字符串总是后30个字符我很容易失去闭元件等</ul>等)。 怎么办? 这似乎是非常困难的,因为我没有通过谷歌找到真正的帮助。XSLT:将字符串解析为XML节点集(concret:将HTML-String转换为节点集)?

我的想法至今:以“分析字符串”和正则表达式选择节点和内容,并把它们写上课XML元素节点。 但是我遇到很大的问题来处理所有情况,特别是嵌套节点。

有人有一些想法吗?

FYI:我的记事本:

  1. 正则表达式:抓住第一个标签
  2. 第一个节点的读标记名
  3. 认沽标记名正则表达式和搜索整个标签,还可以选择字符串的其余部分(去请稍后再试)
  4. 查看完整内容:更多标签?是: - >步骤1中,无: - >步骤5
  5. 写入标签作为节点元件
  6. 字符串取其余 - >步骤1

下面是XML的文档:

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
    <data> 
     <![CDATA[ 
     <h2>header</h2><p>A little article. <b>Here</b> it's already done!</p> 
     ]]> 
    </data> 
</html> 

我想要做什么:

在我有一个字符串(HTML),只是想输出字符的特殊金额(例如,前25)。当我这样做只是在弦上,我得到这样的结果:

"<h2>header</h2><p>A little article" 

在下一步我把这个字符串的HTML输出,但在这一点上,我获得合法的标记,因为<p> -Tag不关闭。

所以我的第一种方法是:解析这个字符串以获取每个标记的XML-Nodes,然后遍历每个节点,编写一个xml元素(以确保最终标记将有效)并复制尽可能多的字符,直到达到极限,在这个例子中将是25个字符。

+0

您可能希望在您的问题中包含您的XML文档。 – ColinE 2012-01-03 09:50:48

+0

你对输入XML有任何控制吗?如果你没有使用CDATA标签,这可能是可能的。使用CDATA标记,HTML字符串仅被视为文本的通用字符串,并且不容易在HTML标记处进行分析。删除CDATA标签,然后您可以开始匹配标签... – 2012-01-03 10:51:43

+0

请编辑您的问题并提供转换所需的结果。目前还不清楚你想要“删除”哪个字符串。 – 2012-01-03 12:56:39

回答

0

如果您有代表HTML的XML节点,那么这应该是实体编码,即打开和关闭括号转换为&lt;&gt; - 这意味着你可以剪你喜欢的地方,仍然有一个有效的XML文档。

+0

是的,正确的。对不起,我不太清楚,因为我想避免一个无效的输出,一个无效的HTML文档(因为缺少关闭元素可能会破坏整个页面视图)。 – 2012-01-03 09:55:52

0

正如您所提到分析串你似乎使用XSLT 2.0。这样,你有两个选择,与撒克逊9有扩展功能http://www.saxonica.com/documentation/extensions/functions/parse.xml(并且要解析HTML甚至一个http://www.saxonica.com/documentation/extensions/functions/parse-html.xml的情况下),再有就是大卫·卡莱尔的纯XSLT 2.0实现的HTML解析器http://code.google.com/p/web-xslt/source/browse/trunk/htmlparse你可以导入你的样式表,然后在数据元素的内容上使用。

+0

非常有趣!我会尝试一下样式表,谢谢你! (PS:是的,我正在使用XSLT 2.0) – 2012-01-03 12:50:54

+0

我测试了David Carlisle的纯XSLT 2.0实现,但我无法使其正常工作。即使大卫卡莱尔的确切例子对我来说也不正确。所以我放弃了我的想法。 :( – 2012-01-10 15:48:08