尽管语法过多,但XML的XSLT处理是声明性转换编程的基石.但是,我总是发现很难理解XSLT如何用于日常任务(使用XML).
在生成HTML之外,XSLT优雅地解决编程问题的一些很好的例子是什么?
我猜它擅长图形转换和数据再处理……
编辑:我希望有一些实际的例子 – 让我完全放弃xslt的一个原因是代码的视觉复杂性.
人们经常可以找到漂亮的XSLT代码的例子,特别是当XSLT用作函数式编程语言时.有关示例,请参阅FXSL 2.0上的this article – 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是素数,否则如果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代码的其他示例:
> Tim Bray‘s Wide Finder,已解决here.
> Cascade deletions
> Transitive closure
> Finding all anagrams一个字
> Concordance文本语料库(旧约)
> Spelling checking(莎士比亚的奥赛罗)
> Sudoku solver
>通用编译器 – 编译器系统 – the LR-Parsing Framework of FXSL,成功用于a parser of JSON和XPath2.0.