xslt的优雅例子?

时间:2009-03-28 21:52:16

标签: xml xslt graph-theory declarative

经过XAML的漫长学习循环之后,我又回到了HTML和javascript,并意识到声明代码的概念 - 在转换规则方面 - 是一个非常强大的概念。

尽管语法过多,但XML的XSLT处理是声明性转换编程的基石。但是,我总是发现很难理解XSLT如何用于日常任务(使用XML)。

在生成HTML之外,XSLT优雅地解决编程问题的一些好例子是什么?

我猜它擅长图形转换和数据再处理......

编辑:我希望有一些实际的例子 - 让我完全放弃xslt的一件事就是代码的视觉复杂性。

3 个答案:

答案 0 :(得分:4)

人们经常可以找到漂亮的XSLT代码示例,特别是当XSLT用作函数式编程语言时

有关示例,请参阅this article上的FXSL 2.0 - XSLT 2.0的函数编程库。

作为FP语言,XSLT也是 declarative language 。除其他外,这意味着一个人声明,指定现有的关系。

这样的定义通常不需要任何额外的代码来产生结果 - 它本身就是它自己的实现,或者是可执行的定义或可执行的规范

以下是一个小例子

此XPath 2.0表达式定义自然数的最大Prime Factor ”:

if(f:isPrime($pNum))
  then $pNum
  else
    for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
        $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
        $vDiv2 in $pNum idiv $vDiv1
      return
        max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))

要用英语发音,数字 pNum 的最大素数因子是数字本身,如果 pNum < / strong>是素数,否则如果 vDiv1 vDiv2 pNum 的两个因素,那么 pNum 的最大素因子是 vDiv1 vDiv2的最大素因子中的较大者

我们如何使用它来实际计算 XSLT中的最大素数因子? 我们只是在<xsl:function>中包含上面的定义,然后......得到结果!

 <xsl:function name="f:maxPrimeFactor" as="xs:integer">
  <xsl:param name="pNum" as="xs:integer"/>

  <xsl:sequence select=
   "if(f:isPrime($pNum))
      then $pNum
      else
        for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
            $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
            $vDiv2 in $pNum idiv $vDiv1
          return
            max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
   "/>
 </xsl:function>

我们可以calculate the MPF for any natural number ,例如:

f:maxPrimeFactor(600851475143) = 6857

就效率而言,此转换只需0.109秒

优质高效的XSLT代码的其他示例

答案 1 :(得分:2)

代码生成怎么样?我在protobuf-net中使用它来从.proto模型创建.cs文件(导出为xml) - like so。在.NET 4.0中,T4模板将是一个更明显的选择,但T4引擎在此之前不是独立的(AFAIK)。

Xslt还广泛用于在不同的xml布局之间进行转换 - 例如,在biztalk等中间件工具中。

答案 2 :(得分:0)

前几天我使用过XSLT。我需要提供一种方法让用户将树控件的内容保存到文件中,以便他们可以通过电子邮件将其发送给他们的老板,将其显示给他们的孙子等等。

要求他们能够将其保存为具有漂亮整洁外观的HTML文件,或者作为XML,以便他们可以根据需要进一步处理它。

所以我建议我们使用链接到它的XSLT输出XML,这样他们就可以使用原始XML,但是当他们在浏览器中打开它时看起来很不错。

这并不理想(如果他们在没有XSL的情况下将HTML移动到其他地方,IE就会拒绝显示它!)但是如果我们改变计划,我可以修改产品,这样它就会让用户选择格式,并且如果他们选择HTML,我所要做的就是在保存之前在XML上运行XSLT来获取HTML。

理想情况下,有一种方法可以制作一个包含XML和XSLT的自包含HTML文件,但我不知道一个......这本身就是一个问题。