如何从另一个模板 XSLT 访问变量作为参数

How to access variable as parameter from another template XSLT

你好我有一个问题,我有2个变量(min_value和max_value)它们在不同的模板MIN和MAX中,在MAX中我想计算[=24=之间的差异] 和 min_value 但结果是 NAN,因为 min_value 值不会从一个模板转移到另一个模板。

 <xsl:template match="MAX">
  <xsl:param name= "min_value"/>
     <xsl:variable name="max_value" select= "SHARE_RATE"/>
   <span class="max_rate">
      MAX: <xsl:apply-templates select="SHARE_RATE"/> 
   </span>
   <br/>
    <span class= "diff">
        Diff:  (<xsl:value-of select="$max_value - $min_value"/>)
    </span>

</xsl:template>


<xsl:template match="MIN">
            <xsl:variable name="min_value"  select="SHARE_RATE"/>

           <span class="SHARE_RATE">
             MIN: <xsl:apply-templates select="SHARE_RATE"/> 
          </span>

         <xsl:apply-templates select="MAX">
           <xsl:with-param name="min_value" select= "$min_value"/>
         </xsl:apply-templates>

</xsl:template>

更新

<page shareid="%" min_rate="%" max_rate="%" skip="0">
<TRANSACTIONS>
<MIN num="1">
<SHAREID>0</SHAREID>
<SHARE_RATE>1200</SHARE_RATE>
</MIN>
<MIN num="2">
<SHAREID>1</SHAREID>
<SHARE_RATE>4200</SHARE_RATE>
</MIN>
<MIN num="3">
<SHAREID>2</SHAREID>
<SHARE_RATE>1600</SHARE_RATE>
</MIN>
<MIN num="4">
<SHAREID>3</SHAREID>
<SHARE_RATE>6100</SHARE_RATE>
</MIN>
<MIN num="5">
<SHAREID>4</SHAREID>
<SHARE_RATE>550</SHARE_RATE>
</MIN>
<MIN num="6">
<SHAREID>5</SHAREID>
<SHARE_RATE>420</SHARE_RATE>
</MIN>
<MIN num="7">
<SHAREID>6</SHAREID>
<SHARE_RATE>2000</SHARE_RATE>
</MIN>
</TRANSACTIONS>
<TRANSACTIONS>
<MAX num="1">
<SHAREID>0</SHAREID>
<SHARE_RATE>2100</SHARE_RATE>
</MAX>
<MAX num="2">
<SHAREID>1</SHAREID>
<SHARE_RATE>5200</SHARE_RATE>
</MAX>
<MAX num="3">
<SHAREID>2</SHAREID>
<SHARE_RATE>2000</SHARE_RATE>
</MAX>
<MAX num="4">
<SHAREID>3</SHAREID>
<SHARE_RATE>7000</SHARE_RATE>
</MAX>
<MAX num="5">
<SHAREID>4</SHAREID>
<SHARE_RATE>1000</SHARE_RATE>
</MAX>
<MAX num="6">
<SHAREID>5</SHAREID>
<SHARE_RATE>2520</SHARE_RATE>
</MAX>
<MAX num="7">
<SHAREID>5</SHAREID>
<SHARE_RATE>2520</SHARE_RATE>
</MAX>
</TRANSACTIONS>
</page>

更新 2

<?xml version="1.0" encoding="ISO-8859-2"?>
<?xml-stylesheet type="text/xsl" href="share.xsl"?>
<page connection="labor"
      xmlns:xsql="urn:oracle-xsql"
      shareid="%" 
      min_rate= "%"
      max_rate= "%"
    skip="0">
<xsql:query rowset-element="TRANSACTIONS"
            row-element="MIN"
            skip-rows="{@skip}"
            max-rows="{@max-rows}"
            bind-params="shareid min_rate ">


SELECT 
    f77inq.shares.shareid, A.share_rate
FROM
    f77inq.trans A

INNER JOIN f77inq.shares ON A.shareid = f77inq.shares.shareid

    WHERE A.shareid LIKE ?
    AND A.share_rate= 
    (
        SELECT 
             MIN(share_rate)
        FROM
            f77inq.trans B
        WHERE
           B.shareid = A.shareid

     ) 

     AND A.share_rate LIKE?
</xsql:query>

<xsql:query rowset-element="TRANSACTIONS"
            row-element="MAX"
            skip-rows="{@skip}"
            max-rows="{@max-rows}"
            bind-params="shareid">


SELECT 
    f77inq.shares.shareid, A.share_rate
FROM
    f77inq.trans A

INNER JOIN f77inq.shares ON A.shareid = f77inq.shares.shareid

    WHERE A.shareid LIKE ?
    AND A.share_rate= 
    (
        SELECT 
             MAX(share_rate)
        FROM
            f77inq.trans B
        WHERE
           B.shareid = A.shareid

     ) 
</xsql:query>
</page>

好的,我的理解是,您想将 MIN/MAX 值与相同的 SHAREID 匹配。在这种情况下,以下 xslt 可能会满足您的需要:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="MAX">
  <xsl:variable name="id" select="SHAREID"/>
  <!-- or '0' handles the case where no coresponding MIN/SHARE_RATE is found -->
  <xsl:variable name="min_value" select="//MIN[SHAREID=$id]/SHARE_RATE or '0'"/>
  <xsl:variable name="max_value" select= "SHARE_RATE"/>
  <span class="max_rate">
   MAX: <xsl:value-of select="$max_value"/> 
  </span>
  <br/>
  <span class= "diff">
   Diff:  (<xsl:value-of select="$max_value - $min_value"/>)
  </span>
 </xsl:template>

 <!-- MAX does it all, so ignore output of MIN -->
 <xsl:template match="MIN"/>

 <xsl:template match="*">
  <xsl:apply-templates/>
 </xsl:template>

</xsl:stylesheet>

我建议您使用 key 到 link MINMAX 值,基于共同的 SHAREID。下面是一个使用 XML 输出的示例,以便更清楚:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="max" match="MAX" use="SHAREID" />

<xsl:template match="/page">
    <root>
        <xsl:apply-templates select="TRANSACTIONS/MIN"/>
    </root>
</xsl:template>

<xsl:template match="MIN">
    <xsl:variable name="id" select="SHAREID" />
    <xsl:variable name="min" select="SHARE_RATE" />
    <xsl:variable name="max" select="key('max', $id)/SHARE_RATE" />
    <share id="{$id}">
        <min><xsl:value-of select="$min"/></min>
        <max><xsl:value-of select="$max"/></max>
        <diff><xsl:value-of select="$max - $min"/></diff>
    </share>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入,结果是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <share id="0">
      <min>1200</min>
      <max>2100</max>
      <diff>900</diff>
   </share>
   <share id="1">
      <min>4200</min>
      <max>5200</max>
      <diff>1000</diff>
   </share>
   <share id="2">
      <min>1600</min>
      <max>2000</max>
      <diff>400</diff>
   </share>
   <share id="3">
      <min>6100</min>
      <max>7000</max>
      <diff>900</diff>
   </share>
   <share id="4">
      <min>550</min>
      <max>1000</max>
      <diff>450</diff>
   </share>
   <share id="5">
      <min>420</min>
      <max>2520</max>
      <diff>2100</diff>
   </share>
   <share id="6">
      <min>2000</min>
      <max>2520</max>
      <diff>520</diff>
   </share>
</root>