Xalan (XSLT) 翻译方法翻译的内容超出了应有的范围
我似乎对 Xalan 的翻译方法有疑问。 我有以下代码:
translate(translate(string(name),'
这用于从 string(name) 中删除 和
。不幸的是,当我这样做时,似乎也从名称中删除了 s、u 和 p。
因此像
sony Braiva tm
这样的名字会变成 ony bravia tm
感谢您提前提供帮助:)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为您说 translate() 函数已成功删除
和
,所以我假设
code> 不是 XML 文档中的元素,而是编码为文本。
translate()函数被定义为替换单个字符,通常不适合字符串长度大于1时的字符串替换。
可以编写和使用通用字符串替换递归模板/ XSLT 中的函数。
XSLT 2.0 程序员可以使用标准 XPath 2.0 函数replace()。
在您的特定情况下,这可能就足够了:
当此转换应用于以下 XML 文档时:
生成所需的结果:
< strong>或者,这里是成熟的递归模板解决方案:
当此转换应用于此 XML 文档时:
生成所需的正确结果:
最后,这是 XSLT 2.0 解决方案:
Because you said that the translate() function is successfully removing
<sup>
and</sup>
, I am assuming that<sup>
is not an element in the XML document, but is encoded as text.The translate() function is defined to substitute individual characters and generally isn't suitable for string replacement when the string length is greater than 1.
It is possible to write and use a general string replacement recursive template/function in XSLT.
XSLT 2.0 programmers can use the standard XPath 2.0 function replace().
In your particular case even this this may be sufficient:
When this transformation is applied on the following XML document:
the wanted result is produced:
Alternatively, here is the full-blown recursive template solution:
When this transformation is applied on this XML document:
the wanted, correct result is produced:
Finally, here is the XSLT 2.0 solution:
tl;dr 版本: 如果可以避免的话,不要将 html 或 xml 作为字符串进行操作。在 XSLT 中进行。
我假设您拥有的某个元素包含类似的内容
,因此看起来您已经在 XSLT 中获得了一个已解析的 XML 文档。然后,您转身尝试使用字符串操作来拉出一些标签。这是个坏主意;有关匹配标签的信息,请参阅此问题 。 XSLT 正是用于这种操作,所以使用它! (如果我的假设是错误的,并且 tm 是实体化的或在 CDATA 部分或其他内容中,我想那是不同的。)
所以,首先。如果您想从名称中删除所有标签,只留下文本,您可以
这样做:
另一方面,如果您想删除所有sup标签及其内容,您首先要在其他地方定义一个与sup匹配的模板(并对您想要删除的任何内容执行相同的操作,例如脚本标签、img标签等):
然后您可以应用
如果您真的想要,你甚至可以做这样的事情并用一个漂亮的 unicode 符号替换 HTML。将其置于不同的模式中并使用该模式消除所有其他标签可能是个好主意。
关于所有这些的免责声明:它是标准 XSLT(甚至可能是 1.0),但我只在在线 Saxon 解析器中尝试过它,而不是在 Xalan 中。
tl;dr version: Don't manipulate html or xml as strings if you can possibly avoid it. Do it in XSLT.
I'm assuming that what you have is some element contains something like
So it looks like you've got a parsed XML document already in XSLT. Then, you're turning around and trying to use string manipulation to pull some tags out. That's a bad idea; see this question about matching tags. XSLT is exactly for this sort of manipulation, so use it! (If my assumption is wrong and that tm is entity-ized or in a CDATA section or whatever, that's different I guess.)
So, first. If you want to strip all tags out of name leaving just the text, you can do
which would give:
If, on the other hand, you want to strip all sup tags and their content, you would first elsewhere define a template matching sup (and do the same with anything you want to rip out, e.g. script tags, img tags, whatever):
And then you can apply
If you really wanted, you could even do something like this and replace that HTML with a nice unicode symbol. It might be a good idea to place this in a different mode and use that mode to eliminate all other tags.
Disclaimer on all of this: It's standard XSLT (probably 1.0 even), but I've only tried it in an online Saxon parser and not in Xalan.