【发布时间】:2009-08-25 18:23:02
【问题描述】:
我有一条XML 数据需要转换成WML。
是这样的:
<root>
<category name="music"/>
<subcategory name="classic"/>
<subcategory name="rock"/>
<subcategory name="Techno"/>
<node type="music" subtype="classic" name="beethoven"/>
<node type="music" subtype="classic" name="chopin"/>
<record author="beethoven" name="moonlight sonata"/>
…
</root>
我无法更改文件结构。
一些Nokia 移动浏览器无法将大量<card> 加载到内存中。
因此,根据移动浏览器的不同,WML 页面应该是一整套 <card> 或 <card> 的某个子集。
例如,如果我用普通浏览器下载一个页面,它应该是这样的:
<wml>
<card id="TOC">
<p><a href="#contents">Contents</a></p>
<p><a href="#az">A-Z</a></p>
</card>
<card id="contents">
<p><a href="#music">music</a></p>
<p><a href="#video">video</a></p>
<p><a href="#java">java</a></p>
</card>
<card id="az">
<p><a href="#beethoven">beethoven</a></p>
<p><a href="#chopin">chopin</a></p>
</card>
<card id="music">
<p><a href="#classic">classic</a></p>
<p><a href="#rock">rock</a></p>
<p><a href="#Techno">Techno</a></p>
</card>
<card id="classic">
<p><a href="#beethoven">beethoven</a></p>
<p><a href="#chopin">chopin</a></p>
</card>
…
</wml>
,以便用户无需额外往返服务器即可浏览。
但是,当我使用Nokia 并访问起始页时,页面应如下所示:
http://example.com/
<wml>
<card id="TOC">
<p><a href="#contents">Contents</a></p>
<p><a href="#az">A-Z</a></p>
</card>
<card id="contents">
<p><a href="#music">music</a></p>
<p><a href="#video">video</a></p>
<p><a href="#java">java</a></p>
</card>
<card id="az">
<p><a href="/beethoven">beethoven</a></p>
<p><a href="/chopin">chopin</a></p>
</card>
<card id="music">
<p><a href="/classic">classic</a></p>
<p><a href="/rock">rock</a></p>
<p><a href="/Techno">Techno</a></p>
</card>
<card id="video">
<p><a href="/movies">Movies</a></p>
</card>
<card id="java">
<p><a href="/games">Games</a></p>
</card>
</wml>
,当我访问href时,它应该显示内部内容:
http://example.com/classic
<wml>
<card id="TOC">
<p><a href="#contents">Contents</a></p>
<p><a href="#az">A-Z</a></p>
</card>
<card id="contents">
<p><a href="/music">music</a></p>
<p><a href="/video">video</a></p>
<p><a href="/java">java</a></p>
</card>
<card id="az">
<p><a href="#beethoven">beethoven</a></p>
<p><a href="#chopin">chopin</a></p>
</card>
<card id="classic">
<p><a href="#beethoven">beethoven</a></p>
<p><a href="#chopin">chopin</a></p>
</card>
…
</wml>
基本上,XSLT 应该做以下事情:
接受要显示的某种参数:类别、子类别等。
-
计算将显示的
<card>。- 如果我们只加载类型和目录,我们会得到
2卡片(我们总是显示它们)- 如果我们只加载类型和子类型,我们会得到
10卡片。 - 如果我们加载类型、子类型和标题,我们会显示
100卡片。 - 如果我们加载所有内容,我们会显示
300卡片。
- 如果我们只加载类型和子类型,我们会得到
Nokia不能处理超过120的卡片,所以我们只停留在3级别。如果
XML发生变化并且3级别需要130卡片,我们应该在2级别停止。 - 如果我们只加载类型和目录,我们会得到
如果
<card>低于某个级别,则不要显示它如果不显示卡片,请将
#(内部链接)替换为/(外部链接)。
是否可以在单个XSL 文件中执行?
【问题讨论】:
-
只有一级 URL 吗?斜线+关键字,就这样?这不会导致歧义吗?还是网址是结构化的?
-
不,不会。它旨在一次容纳所有卡片,并且它们需要具有不同的名称。刚刚测试的时候出现的问题。
-
所以我可以相信@names 在所有类别/子类别/节点/记录元素中都是唯一的?
-
@Tomalak:绝对。其实id就是typeGUID、subGUID、nameGUID等等,为了简洁,我用了实名。 -
好的。您所说的这些限制是完全要在 XSL 中处理还是在基础数据中处理?例如:是否有不超过 8 个子类型(8+2=10 张卡片,包括 toc 和 a-z)?