0

我正在编写自己的模板引擎,主要用于 Web 应用程序。

它实际上是我自己的 XML 标签和 HTML 的混合。

这是示例:

<lp:view xmlns:lp="http://sminit.com/view" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://sminit.com/view view.xsd ">
    <lp:list name="my_items">

        <lp:list_header>

            <table>

        </lp:list_header>

        <lp:list_item>

              <tr><td>$title$</td></tr>

        </lp:list_item>

        <lp:list_footer>
                </table>
        </lp:list_footer>

    </lp:list>
</lp:view> 

一点解释:那些以“lp”为前缀的标签属于我的模板引擎,是一种“处理指令”。lp:view 是一个根节点,然后有一个 lp:list 节点,它接收到一些数据源将生成一个列表:首先它将包含 lp:list_header 的内容,然后重复 lp:list_item 的内容(替换 $ title$ 由实际数据,但这里无所谓),那么它将添加 lp:list_footer 节点的内容。如您所见,出于这个原因,我的标签之间有 html 标签“表格”。

我在这里遇到了两个主要问题: 1. Eclipse 抱怨“表”没有正确关闭——我希望 Eclipse 停止抱怨,将此标签视为文本,或者——也许你可以提出一些建议?2. 如果我在任何 html 标签内,Eclipse 将不会显示任何代码提示。(代码提示:此标签可能使用的属性,如“class”或“id”等)

我知道我在问一个奇怪的怪问题,但也许这里有一些 XSD 大师可以指导我: Eclipse 应该将我的 xml 模板文件如下处理: 1. 以“lp”为前缀的标签是神!它们优先于其他任何东西。仅应显示来自该标签的错误(缺少必需的属性、缺少必需的子元素等)。2.所有其他标签(尖括号之间的任何东西)都是HTML标签。Eclipse 应该为它们显示代码提示,但如果有任何“不正确”的东西(如在我的示例中:没有关闭 /table 标记)——Eclipse 不应该抱怨。

我希望这是可能的。

谢谢!

4

2 回答 2

0

这只是部分答案,但我仍将其作为答案,因为输入评论太长了。

要阻止 Eclipse 抱怨未关闭的标签,您应该将内容包装在一个<![CDATA[..]]部分中,如下所示:

<lp:view xmlns:lp="http://sminit.com/view" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sminit.com/view view.xsd ">
  <lp:list name="my_items">

    <lp:list_header>

        <![CDATA[ <table> ]]>

    </lp:list_header>

    <lp:list_item>

          <tr><td>$title$</td></tr>

    </lp:list_item>

    <lp:list_footer>
            <![CDATA[ </table> ]]>
    </lp:list_footer>

</lp:list>

它们将被视为文本,Eclipse 不会抱怨,但在这种情况下,您将丢失 CDATA 部分中的任何 Eclipse 完成。

为了使 HTML 标记的完成工作,我认为您可以尝试将 XHTML 的默认命名空间添加到您的根标记,如下所示:

<?xml version="1.0" ?>
<lp:view xmlns="http://www.w3.org/1999/xhtml" xmlns:lp="http://sminit.com/view" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sminit.com/view view.xsd ">
  <lp:list name="my_items">

    <lp:list_header>

        <![CDATA[ <table> ]]>

    </lp:list_header>

    <lp:list_item>

          <tr><td>$title$</td></tr>

    </lp:list_item>

    <lp:list_footer>
            <![CDATA[ </table> ]]>
    </lp:list_footer>

</lp:list>

编辑:我认为第二部分不起作用,因为 XHTML 模式定义了根元素应该是<html>. <html>我刚刚在 Eclipse 中尝试过,HTML 标签的补全仅在我第一次在文档中的某处插入标签时才开始工作。也许其他一些人可以权衡。

于 2011-12-22T09:45:48.107 回答
0

您必须将 HTML 包装在CDATA块中。这将使 XML 解析器将内容(未关闭的<table>)视为纯文本,而不是损坏的标签。

    <lp:list_header><![CDATA[

        <table>

    ]]></lp:list_header>
于 2011-12-22T09:40:55.137 回答