4

在通过 XAML 进行了长时间的学习循环之后,我回到了 HTML 和 javascript,并意识到声明性代码的概念——就转换规则而言——是一个非常强大的概念。

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

除了生成 HTML 之外,还有哪些 XSLT 优雅地解决编程问题的好例子?

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

编辑:我希望有一些实际的例子——让我完全不了解 xslt 的一件事是代码的视觉复杂性。

4

3 回答 3

4

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

有关示例,请参阅这篇关于FXSL 2.0 的文章——XSLT 2.0的函数式编程库。

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

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

这是一个小例子

这个 XPath 2.0 表达式定义了“自然数的最大素因子”:

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 是素数,否则如果 vDiv1vDiv2是 的两个因数pNum,那么 的最大素因数是和的最大素因数中pNum较大的一个。vDiv1vDiv2

我们如何使用它来实际计算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>

然后,我们可以计算任何自然数的 MPF,例如:

f:maxPrimeFactor(600851475143)= 6857

至于效率,嗯,这个转换只需要 0.109 秒

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

于 2009-03-29T01:41:44.573 回答
2

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

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

于 2009-03-28T21:55:08.207 回答
0

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

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

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

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

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

于 2009-03-28T22:09:53.803 回答