使用 XSLT 截断 XML
我有一个问题要问 SO 社区的聪明人。
以下是 Symphony CMS 生成的 XML 片段。
<news>
<entry>
<title>Lorem Ipsum</title>
<body>
<p><strong>Lorem Ipsum</strong></p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed malesuada auctor magna. Vivamus urna justo, pulvinar nec, sagittis malesuada, accumsan in, massa. Quisque mi purus, gravida eget, ultricies a, porta in, sem. Maecenas justo elit, elementum vel, feugiat vulputate, pulvinar nec, velit. Fusce vel ante et diam bibendum euismod. Nunc vel nulla non lorem dignissim placerat. Nulla magna massa, auctor et, tempor nec, auctor sit amet, turpis. Quisque odio lacus, auctor at, posuere id, suscipit eget, dui. Phasellus aliquam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin varius. Phasellus cursus. Cras mattis adipiscing turpis. Sed.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed malesuada auctor magna.</p>
</body>
</entry>
</news>
我需要做的是根据指定的长度获取 元素的一部分,以以下博客样式显示:
Lorem ipsum dolor sat amet, consectetur adipiscing elit。 塞德 马莱苏阿达 麦格纳演员。 维瓦姆斯乌尔纳 justo、pulvinar nec、sagittis malesuada、accumsan、马萨。 基斯克 mi purus, gravida eget, ultricies a, porta in,sem...更多
...其中 more 是完整新闻项目的链接。 我知道我可以选择特定的段落,我也知道我可以使用 substring 函数来带来指定数量的字符。 但是,我需要保留文本的格式,即 元素中的 HTML 标记。
我意识到这会引起标签关闭的问题,但肯定有办法。 希望对 XSLT 更有经验的人能够阐明这个问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是一个完整的 XSLT 1.0 转换,它完全解决了问题。
此 XSLT 转换:
应用于原始源 XML 文档时:
产生所需的结果 >:
请注意以下内容:
FXSL 库 已导入。 此模板通常用于积累处理项目列表的数据。 执行实际处理的函数(与
myAdd:*
匹配的模板)作为参数传递给scanl
模板。 必须传递给它的另一个参数是处理中的“初始”值,如果传递的项目列表为空,则返回该值。全局参数
$pTruncateLength
保存最大字符串长度,超过该长度文本必须被截断Here is a complete XSLT 1.0 transformation that solves exactly the problem.
This XSLT transformation:
when applied on the original source XML document:
produces the wanted result:
Do note the following:
The
scanl
stylesheet from the FXSL library is imported. This template is commonly used to accumulate data from processing a list of items. The function (the template matchingmyAdd:*
) that does the actual processing is passed as a parameter to thescanl
template. The other parameter that must be passed to it is the "initial" value from processing, which is to be returned if the passed list of items is empty.The global parameter
$pTruncateLength
holds the maximum string length exceeding which the text must be truncated您要求的是一个 XSLT 省略号 生成器。
也许这个 xslt 1.0 模板 可能会给您一些想法:
以下是其主要要点:
注意:
What you are asking is an XSLT ellipsis generator.
May be this xslt 1.0 template might give you some idea:
Here is the main gist of it:
Note:
<use xlink:href="...
", you need to declare the xlink namespace经过多次黑客攻击后,我得出了这个解决方案:
不过,我会使用混沌模式的解决方案,它更优雅;-)
After much hacking, I came to this solution:
I would use the solution by Chaotic Pattern though, it's more elegant ;-)
这将是使用 XSLT 的一个痛苦插曲。 我强烈建议使用 Perl/Python 等脚本语言来尝试此操作。
This will be an episode in pain using XSLT. I would strongly recommend using a scripting language like Perl/Python to attempt this.
这是我的版本。 我已经在您的 XML 示例上对其进行了测试,并且它有效。
要调用它,请使用
。Here's my version. I've tested it over your XML sample and it works.
To invoke it, use
<xsl:apply-templates select="path/to/body/*" mode="truncate"/>
.