0

我有一段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>将显示的 '。

    1. 如果我们只加载类型和目录,我们会得到2卡片(我们总是显示它们)
      • 如果我们只加载类型和子类型,我们会得到10卡片。
      • 如果我们加载类型、子类型和标题,我们会显示100卡片。
      • 如果我们加载所有内容,我们会显示300卡片。

    Nokia只能处理120卡片,所以我们就停在 level 上3

    如果XML更改和级别3需要130卡,我们应该停止在级别2

  • <card>如果低于特定水平,则不显示

  • 如果不显示卡片,将#(inner links)替换为(outer links)。/

是否可以在单个XSL文件中执行?

4

3 回答 3

1

我不确定问题到底是什么。正如所言,答案是“是的,这是可能的” -xsl:if并且xsl:choose应该足以处理您的所有条件。您必须通过参数向样式表传达限制(例如结果将发送到诺基亚的事实) - 请参阅xsl:param.

于 2009-08-26T00:04:24.553 回答
0

我建议创建变量来累积计算每个“级别”(类型、子类型、标题……)的所有节点,并为您的 XSL 提供一个参数,指示要生成的最大卡片数。XSL 可能看起来像这样:

<xsl:stylesheet …&gt;
  <xsl:param name="max-cards" select="999999"/>

  <xsl:template match="/root">
    <!-- "2" here for the type/TOC cards -->
    <xsl:variable name="nSubs" select="2 + count(subcategory)"/>
    <xsl:variable name="nNodes" select="$nSubs + count(node)"/>
    <xsl:variable name="nRecs" select="$nNodes + count(record)"/>

    <!-- generate types & TOC here -->

    <xsl:if test="$nSubs < $max-cards">
        <!-- generate subtypes here -->
    </xsl:if>

    <xsl:if test="$nNodes < $max-cards">
        <!-- generate titles here -->
    </xsl:if>

    <xsl:if test="$nRecs < $max-cards">
        <!-- generate everything else here -->
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

样式表参数可以类似地用于限制上层的生成,但是对于 SO 来说,这样的例子太长了。^.^

于 2009-08-26T00:28:33.833 回答
0

我的理解是 XSL 正在完善,因此几乎可以回答“有可能吗?” 问题将是肯定的。“你会喜欢它吗?”的答案,也许不是那么多:-)

一个简单的方法是使用 <xsl:param> 来传递控制参数,并使用 <xsl:choose> 选择要显示的格式,然后分支/委托给特定的模板或函数。对于每种格式。

在您的格式有共同点的地方,您可以通过将这些部分委托给它们自己的模板或函数来干掉它,在主要格式的更高级别模板中重用它们。基本分而治之。

编辑:更具体地说明我的意思是委托,我的意思是显式调用模板并将它们参数化,例如:

   <xsl:call-template name="showcard">
     <xsl:with-param name="kind" select="nokia"/>
   </xsl:call-template>

将这些模板依次委托给其他模板,等等。您还可以从 value-of 和 apply-templates 中获得很多东西,这些模板将流程引导到特定模板。尽管您的案例可能更简单,但这可能会导致代码更具可读性。

于 2009-08-26T16:54:02.427 回答