使用 xforms 在元素中换行
Posted
技术标签:
【中文标题】使用 xforms 在元素中换行【英文标题】:Wrap text in element using xforms 【发布时间】:2016-06-30 13:39:22 【问题描述】:有没有办法使用 xforms 将标记的文本包装在元素中?例如:
在 word
周围加上标签
-->
在这个<tag>
word</tag>
周围加上标签
我是 xforms 的新手,目前在exist-db 服务器上使用 Xsltxforms,我试图弄清楚我是否遗漏了某些东西,或者没有办法在 textarea 框中制作这样的东西。提前谢谢!
【问题讨论】:
【参考方案1】:XForms Recommendation 中没有这种处理的机制。
但这已作为 XSLTForms 中的扩展添加:名为“xf:wrap”的额外操作允许指示要考虑控制以及要在选择之前和之后添加什么。
<?xml-stylesheet href="xsl/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
<title>Wrap Selection</title>
<xf:model>
<xf:instance>
<data xmlns="">Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.</data>
</xf:instance>
</xf:model>
</head>
<body>
<xf:trigger>
<xf:label><a></xf:label>
<xf:wrap ev:event="DOMActivate" control="t" pre="<a>" post="</a>"/>
</xf:trigger>
<xf:trigger>
<xf:label><b></xf:label>
<xf:wrap ev:event="DOMActivate" control="t" pre="<b>" post="</b>"/>
</xf:trigger>
<xf:trigger>
<xf:label><c></xf:label>
<xf:wrap ev:event="DOMActivate" control="t" pre="<c>" post="</c>"/>
</xf:trigger>
<br/>
<xf:textarea id="t" ref="." incremental="true"/>
<br/>
<xf:output value=".">
<xf:label>Value: </xf:label>
</xf:output>
</body>
</html>
xf:setselection 操作还有另一种可能性:
<?xml-stylesheet href="xsl/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
<title>Set Selection</title>
<xf:model>
<xf:instance>
<data xmlns="">Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium...</data>
</xf:instance>
</xf:model>
</head>
<body>
<xf:trigger>
<xf:label><span></xf:label>
<xf:setselection ev:event="DOMActivate" control="t" value="concat('<span start="', control-property('t', 'selectionStart'), '" end="', control-property('t', 'selectionEnd'), '">', selection('t'), '</span>')"/>
</xf:trigger>
<br/>
<xf:textarea id="t" ref="." incremental="true"/>
<br/>
<xf:output value=".">
<xf:label>Value: </xf:label>
</xf:output>
</body>
</html>
现场演示:http://www.agencexml.com/direct/wrap/setselection.xml
你怎么看?
【讨论】:
谢谢你,阿兰!这似乎正是我所需要的......但我不确定如何实现这个功能。当我尝试在存在数据库服务器上打开您的文件时,它返回 XSLTforms 异常:初始化错误:不支持 xforms:wrap。我想我必须在 xsltforms.xsl 中添加一些额外的代码来添加这个额外的操作(正如你所写的“XSLTForms 中的扩展”)? @nassoo 在 eXist-db 中,您可以删除xsltforms
目录的当前内容(使用 WebDAV 或 eXist Java Admin Client)。然后从 GitHub 克隆最新的 XSLTForms 代码,并使用 XSLTForms 存储库中 build
目录的内容重新填充 eXist 中的 xsltforms
目录。我假设您使用的是 eXist 2.2?我认为 eXist 3.0 RC1 还不能与最新版本的 XSLTForms 一起使用。【参考方案2】:
修正答案:一些可能的解决方案是将诸如 Rangy (https://github.com/timdown/rangy) 之类的库集成到 XSLTForms 中,或者甚至是诸如 TinyMCE 之类的富文本编辑器(XSLTForms 在此示例中所做的:http://www.agencexml.com/xsltforms/tinymce.xml)。另一种选择是查看专为 TEI 设计的 Teian(https://sourceforge.net/projects/teian/),但可能是朝着正确方向迈出的一步。
【讨论】:
以上是关于使用 xforms 在元素中换行的主要内容,如果未能解决你的问题,请参考以下文章