鉴于此源文件:
<things>
<thing><duck>Eider</duck></thing>
<thing><duck>Mallard</duck></thing>
<thing><duck>Muscovy</duck></thing>
</things>
我需要以下输出
Fat Eider, Fat Mallard, Fat Muscovy
我确实可以通过这个 XSL 转换得到:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of separator=", ">
<xsl:apply-templates select="//duck"/>
</xsl:value-of>
</xsl:template>
<xsl:template match="duck" as="xs:string">
<xsl:value-of select="concat('Fat ', .)"/>
</xsl:template>
</xsl:stylesheet>
但是,我有三个问题:
问题1.(具体)
如果我as="xs:string"
从鸭子模板中删除,我会得到以下输出:
Fat EiderFat MallardFat Muscovy
为什么?我的理解是,在 XSLT 2.0 中,结果xsl:apply-templates
始终是一个序列,并且xsl:value-of
将其插入separator
到序列中的项目之间。那么为什么当模板没有as
属性时序列似乎“崩溃”了呢?将我指向 Michael Kay 出色的“XSLT 2.0 和 XPath 2.0,第 4 版”一书的适当页面的奖励积分。
问题2。(含糊不清!)
作为 XSLT 的新手,在我看来可能有很多方法可以解决这个问题。你能提出一个采用不同方法的好的解决方案吗?您如何在方法之间进行选择?
问题 3。
调试。您能否推荐如何转储中间结果,这些结果表明as
属性的存在和不存在之间的差异template
?