1

コードに要件があり、次のとおりです。

  • 私の Java プログラムのパラメーターは、処理のために XSLT(X1) に渡されます。X1 は 1 つの文字列値のみを返します。
  • パラメータの別のセットは、処理のために別の XSLT(X2) に渡されます。X2 も 1 つの文字列値のみを返します。
  • 変換後、XSLT の結果を別の XSLT(X3) に渡す必要があります。この XSLT(X3) は、値を変数として使用し、X1 と X2 からの結果に基づいて結果を生成します。

私が調査した限りでは、XSLT 変数の値は一度保存すると変更できません。また、これらの値は、 <xsl:apply-template name="someTemplate" > をパラメーター タグで呼び出すときにパラメーターとして受信されます。

Java で結果を文字列に取得し、それらをパラメータとして次のテンプレートに渡すことで、この機能を実装できます。しかし、XSLT を介して直接同じことができるかどうかを知りたかったのです。

助けてください

編集:Xalanをタグとして削除

4

1 に答える 1

1

結果をJavaのStringに取得し、それらをパラメーターとして次のテンプレートに渡すことで、この機能を実装できます。しかし、XSLTを介して同じことが直接実行できるかどうかを知りたいと思いました。

はい、XSLT2.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>

3つのパスが実行され、それぞれに独自のパラメーターがあります。num各パスは、要素の合計を計算します。その値は、指定されたパラメーターの倍数です。最後に、3つのパスの結果が合計され、最終結果として返されます。

63

XSLT 1.0プロセッサでもまったく同じ変換を実行できますが"as='xs:integer'"、コードから文字列を削除する必要があります。

于 2012-11-02T12:00:53.317 に答える