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

处理多个XSLT并将结果传递给另一个XSLT,以便在Java中进行转换,java,xml,xslt,xslt-2.0,Java,Xml,Xslt,Xslt 2.0,我的代码中有一个要求,如下所示: Java程序中的参数被传递给XSLT(X1)进行处理。X1只返回一个字符串值 另一组参数被传递给另一个XSLT(X2)进行处理。X2也只返回一个字符串值 转换后,XSLT结果需要传递给另一个XSLT(X3),该XSLT将使用该值作为变量,并根据X1和X2生成结果 据我所知,XSLT变量值一旦存储就不能修改。并且这些值在调用时作为参数接收,并带有参数标记 我可以通过在Java中将结果检索成字符串并再次将其作为参数传递给下一个模板来实现此功能。但我想知道是否可

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

  • Java程序中的参数被传递给XSLT(X1)进行处理。X1只返回一个字符串值
  • 另一组参数被传递给另一个XSLT(X2)进行处理。X2也只返回一个字符串值
  • 转换后,XSLT结果需要传递给另一个XSLT(X3),该XSLT将使用该值作为变量,并根据X1和X2生成结果
据我所知,XSLT变量值一旦存储就不能修改。并且这些值在调用时作为参数接收,并带有参数标记

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

请帮忙

编辑:Xalan已作为标记删除

我可以通过将结果检索到 字符串,并再次将它们作为参数传递给下一个 模板。但我想知道是否可以通过 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>
63
XSLT 1.0处理器可以运行完全相同的转换,但必须从代码中删除任何字符串
“as='xs:integer'

我可以通过将结果检索到 字符串,并再次将它们作为参数传递给下一个 模板。但我想知道是否可以通过 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>
63

XSLT 1.0处理器可以运行完全相同的转换,但必须从代码中删除任何字符串
“as='xs:integer'

您已将问题标记为
xalan
XSLT-2.0
。这是没有意义的,因为Xalan是一个XSLT 1处理器,所以考虑清楚你要使用哪一个版本的处理器。你已经把你的问题标记为<代码> Xala以及<代码> XSLT-2.0<代码>。这是没有意义的,因为Xalan是一个XSLT 1处理器,所以请考虑清楚你想要使用哪种版本的处理器。请使用一个例子,我有3个不同的XSLT,然后调用它们中的2个,然后使用2的结果调用第三XSLT的模板,并将它们作为参数传递。帮助..@VinetVerma,只需删除具有模式的模板,并将具有相同模式的所有模板放在不同的XSLT样式表中。在“main”样式表导入中(使用
)这三个样式表。然后执行转换,得到相同的正确结果。至于“并行”——XSLT中没有这样的概念——人们永远无法确定某些代码路径是顺序执行还是并行执行。更不用说一些XSLT处理器执行延迟执行。所以,我完全回答了您最初的问题。如果你有新的问题,请以。。。新问题请您使用一个示例,其中我有3个不同的XSLT,然后并行调用其中的2个,然后使用2的结果调用第3个XSLT的模板并将其作为参数传递..这将非常有用..@VinetVerma,只需删除具有模式的模板,并将具有相同模式的所有模板放在不同的XSLT样式表中。在“main”样式表导入中(使用
)这三个样式表。然后执行转换,得到相同的正确结果。至于“并行”——XSLT中没有这样的概念——人们永远无法确定某些代码路径是顺序执行还是并行执行。更不用说一些XSLT处理器执行延迟执行。所以,我完全回答了您最初的问题。如果你有新的问题,请以。。。新问题