处理多个XSLT并将结果传递给另一个XSLT以便在Java中进行转换

时间:2012-11-02 11:04:03

标签: java xml xslt xslt-2.0

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

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

据我所研究,XSLT变量值一旦存储就无法修改。并且当调用< xsl:apply-template name =“someTemplate”>时,这些值作为参数被接收。和参数标签。

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

请帮忙

编辑:Xalan已删除为标记

1 个答案:

答案 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'"