1

我的代码中有一个要求,如下所示:

  • 我的 Java 程序中的参数被传递给 XSLT(X1) 进行处理。X1 只返回一个字符串值。
  • 另一组参数被传递给另一个 XSLT(X2) 进行处理。X2 也只返回一个字符串值。
  • 转换后,XSLT 结果需要传递给另一个 XSLT(X3),该 XSLT(X3) 将使用该值作为变量,并根据 X1 和 X2 的结果生成结果。

据我研究,XSLT 变量值一旦存储就无法修改。并且这些值在调用 <xsl:apply-template name="someTemplate" > 并带有参数标记时作为参数接收。

我可以通过将结果检索到 Java 中的 String 并再次将它们作为参数传递给下一个模板来实现此功能。但我想知道是否可以直接通过 XSLT 完成相同的操作。

请帮忙

编辑:Xalan 作为标签被移除

4

1 回答 1

1

我可以通过将结果检索到 Java 中的 String 并再次将它们作为参数传递给下一个模板来实现此功能。但我想知道是否可以直接通过 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'"必须从代码中删除任何字符串。

于 2012-11-02T12:00:53.317 回答