经过XAML的漫长学习循环之后,我又回到了HTML和javascript,并意识到声明代码的概念 - 在转换规则方面 - 是一个非常强大的概念。
尽管语法过多,但XML的XSLT处理是声明性转换编程的基石。但是,我总是发现很难理解XSLT如何用于日常任务(使用XML)。
在生成HTML之外,XSLT优雅地解决编程问题的一些好例子是什么?
我猜它擅长图形转换和数据再处理......
编辑:我希望有一些实际的例子 - 让我完全放弃xslt的一件事就是代码的视觉复杂性。
答案 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文件,但我不知道一个......这本身就是一个问题。