我的代码中有一个要求,如下所示:
据我所研究,XSLT变量值一旦存储就无法修改。并且当调用< xsl:apply-template name =“someTemplate”>时,这些值作为参数被接收。和参数标签。
我可以通过将结果检索到Java中的String并再次将它们作为参数传递给下一个模板来实现此功能。但我想知道是否可以通过XSLT直接完成相同的工作。
请帮忙
编辑:Xalan已删除为标记
答案 0 :(得分:1)
我可以通过检索结果来实现此功能 Java中的字符串并再次将它们作为参数传递给下一个 模板。但我想知道是否可以直接通过相同的方式完成 XSLT。
是的,这是一个XSLT 2.0示例:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pP1" select="2"/>
<xsl:param name="pP2" select="3"/>
<xsl:param name="pP3" select="5"/>
<xsl:variable name="vPass1">
<xsl:apply-templates mode="pass1">
<xsl:with-param name="pP1" select="$pP1"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:variable name="vPass2">
<xsl:apply-templates mode="pass2">
<xsl:with-param name="pP2" select="$pP2"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:variable name="vPass3">
<xsl:apply-templates mode="pass3">
<xsl:with-param name="pP3" select="$pP3"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="$vPass1 + $vPass2 + $vPass3"/>
</xsl:template>
<xsl:template match="/*" mode="pass1">
<xsl:param name="pP1" as="xs:integer"/>
<xsl:value-of select="sum(*[. mod $pP1 = 0])"/>
</xsl:template>
<xsl:template match="/*" mode="pass2">
<xsl:param name="pP2" as="xs:integer"/>
<xsl:value-of select="sum(*[. mod $pP2 = 0])"/>
</xsl:template>
<xsl:template match="/*" mode="pass3">
<xsl:param name="pP3" as="xs:integer"/>
<xsl:value-of select="sum(*[. mod $pP3 = 0])"/>
</xsl:template>
</xsl:stylesheet>
对以下XML文档应用此转换时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
执行三次传递,每次传递都有自己的参数。每次传递计算num
个元素的总和,其值是所提供参数的倍数。最后,将三个过程的结果相加并作为最终结果返回:
63
使用XSLT 1.0处理器可以运行完全相同的转换,但必须从代码中删除任何字符串"as='xs:integer'"
。