Xslt 为什么应用的模板重复两次

Xslt 为什么应用的模板重复两次,xslt,xslt-1.0,Xslt,Xslt 1.0,您好,我已经应用了一个模板,数据应该只填充一次,这里的问题是它重复了两次,有人能建议停止重复吗?找到下面我的xsl示例代码 以下是我的XSL: <xsl:param name="PackageId" /> <xsl:template match="/"> <xsl:apply-templates mode="SequenceB" select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId]

您好,我已经应用了一个模板,数据应该只填充一次,这里的问题是它重复了两次,有人能建议停止重复吗?找到下面我的xsl示例代码

以下是我的XSL:

   <xsl:param name="PackageId"  />
  <xsl:template match="/">      
    <xsl:apply-templates mode="SequenceB"  select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId]"/>
    <xsl:apply-templates mode="sequenceC"  select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1]"/>
</xsl:template>
 <xsl:template mode ="SequenceB" match="NewDataSet/Table">

    <xsl:choose >

          <xsl:when  test ="substring(./MSG_TYPE_CODE,2,3)= '102'"  >

                <xsl:if test ="./CTD_SEQ_NUM"  >
                    <xsl:if test=" position() &gt; 1"></xsl:if>
                    <xsl:value-of select= "concat(':21:',./CTD_SEQ_NUM)" />
                    <xsl:text>&#13;</xsl:text >
                </xsl:if>
              <xsl:if test ="./CURRENCY_CODE" >
                  <xsl:if test=" position() &gt; 1"></xsl:if>
                  <xsl:text/><xsl:value-of select= "concat(':32B:',./CURRENCY_CODE)"/>

              </xsl:if>
              <xsl:if test ="./CTD_SETLD_TRAN_AMT" >
                  <xsl:if test=" position() &gt; 1"></xsl:if>
                  <xsl:text/><xsl:value-of select= "translate(./CTD_SETLD_TRAN_AMT ,'.',',')"/>
                  <xsl:text>&#13;</xsl:text >
              </xsl:if>
        </xsl:when>
    <xsl:when test ="substring(./MSG_TYPE_CODE,2,3)= '103'">
            <xsl:if test ="./TRAN_TYPE_CODE"  >
                <xsl:text/><xsl:value-of select=           "concat(':26T:',./TRAN_TYPE_CODE)" /><xsl:text/>
            </xsl:if>
            <xsl:if test ="./CTD_VALUE_DATE" >
                <xsl:text/><xsl:value-of select= "concat(':32A:',./CTD_VALUE_DATE)"/><xsl:text/>
            </xsl:if>
            <xsl:if test ="./CURRENCY_CODE" >
                <xsl:text/><xsl:value-of select= "./CURRENCY_CODE"/><xsl:text/>
            </xsl:if>
            <xsl:if test ="./CTD_SETLD_TRAN_AMT" >
                <xsl:text/><xsl:value-of select= "translate(./CTD_SETLD_TRAN_AMT,'.',',')"/><xsl:text/>
            </xsl:if>
      </xsl:when>
           </xsl:choose>
</xsl:template> 

     <xsl:template mode="sequenceC" match="NewDataSet/Table">

    <xsl:if test ="substring(./MSG_TYPE_CODE,2,3)= '102'">

    <xsl:if test ="./CTD_VALUE_DATE" >
        <xsl:text/><xsl:value-of select= "concat(':32A:',./CTD_VALUE_DATE)"/><xsl:text/>
    </xsl:if>
    <xsl:if test ="./CURRENCY_CODE" >
        <xsl:text/><xsl:value-of select= "./CURRENCY_CODE"/><xsl:text/>
    </xsl:if>
    <xsl:if test ="./CTD_SETLD_TRAN_AMT" >
        <xsl:text/><xsl:value-of select= "translate(./CTD_SETLD_TRAN_AMT,'.',',')"/>
        <xsl:text>&#13;</xsl:text >
    </xsl:if>
     </xsl:template>




以下是我的XML:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
  <RECORD_TYPE_CODE>CTD</RECORD_TYPE_CODE>
  <MSG_TYPE_CODE>O102N</MSG_TYPE_CODE>
  <CTD_SEQ_NUM>000001</CTD_SEQ_NUM>
  <CTD_BEN_INS_ID>ABNAAEAD</CTD_BEN_INS_ID>
  <TRAN_TYPE_CODE>MIS</TRAN_TYPE_CODE>
  <CTD_VALUE_DATE>110911</CTD_VALUE_DATE>
  <CURRENCY_CODE>AED</CURRENCY_CODE>
  <CTD_SETLD_TRAN_AMT>42404.00</CTD_SETLD_TRAN_AMT>
  <CTD_INS_AMT>42404.00</CTD_INS_AMT>
  <CTD_CTD_PKG_ID>2</CTD_CTD_PKG_ID>    
 </Table>
 <Table>
  <RECORD_TYPE_CODE>CTD</RECORD_TYPE_CODE>
  <MSG_TYPE_CODE>O102N</MSG_TYPE_CODE>
  <CTD_SEQ_NUM>000002</CTD_SEQ_NUM>
 <CTD_BEN_INS_ID>ABNAAEAD</CTD_BEN_INS_ID>
 <TRAN_TYPE_CODE>MIS</TRAN_TYPE_CODE>
 <CTD_VALUE_DATE>110911</CTD_VALUE_DATE>
 <CURRENCY_CODE>AED</CURRENCY_CODE>
 <CTD_SETLD_TRAN_AMT>154776.75</CTD_SETLD_TRAN_AMT>
 <CTD_INS_AMT>154776.75</CTD_INS_AMT>
 <CTD_CTD_PKG_ID>2</CTD_CTD_PKG_ID>    
 </Table>
<Table>
<RECORD_TYPE_CODE>CTD</RECORD_TYPE_CODE>
<MSG_TYPE_CODE>O102N</MSG_TYPE_CODE>
<CTD_SEQ_NUM>000003</CTD_SEQ_NUM>
<CTD_BEN_INS_ID>ABNAAEAD</CTD_BEN_INS_ID>
<TRAN_TYPE_CODE>MIS</TRAN_TYPE_CODE>
<CTD_VALUE_DATE>110911</CTD_VALUE_DATE>
<CURRENCY_CODE>AED</CURRENCY_CODE>
<CTD_SETLD_TRAN_AMT>1800.00</CTD_SETLD_TRAN_AMT>
   <CTD_INS_AMT>1800.00</CTD_INS_AMT>
<CTD_CTD_PKG_ID>2</CTD_CTD_PKG_ID>    
      </Table>
      </NewDataSet>

CTD
O102N
000001
阿布纳海德
管理信息系统
110911
AED
42404
42404
2.
CTD
O102N
000002
阿布纳海德
管理信息系统
110911
AED
154776.75
154776.75
2.
CTD
O102N
000003
阿布纳海德
管理信息系统
110911
AED
1800
1800
2.
输出:

:21:000001 :32B:AED42404,00 :21:000001 :32B:AED42404,00 :21:000002 :32B:154776,75德国第纳尔 :21:000002 :32B:154776,75德国第纳尔 :21:000003 :32B:1800,00德国第纳尔 :21:000003 :32B:1800,00德国第纳尔 :32A:110911AED42404,00

所需输出为:

:21:000001 :32B:AED42404,00 :21:000002 :32B:154776,75德国第纳尔 :21:000003 :32B:1800,00德国第纳尔
:32A:110911AED42404,00

在您的第一个模板中,您有以下几行:

<xsl:if test=" position() &gt; 1"></xsl:if>

这一行不做任何事情,只有当条件为true时才执行的代码应该在标记之间(正如您在其他地方所做的那样)

类似地,在一些地方也有这样的东西:

<xsl:text/><xsl:value-of select= "./CURRENCY_CODE"/><xsl:text/>

text
标记没有任何作用,因为它们是自动关闭的


您应该对所有标签的打开/关闭进行一轮清理。即使问题没有消失,分析起来也会容易得多。

XSLT示例目前的格式不好。最终模板中似乎缺少xsl:if end标记。请你纠正一下,这样就不会有混淆了。此外,XSLT在应用模板时引用了CTD_CTD_PKG_ID元素,但这在示例XML中并不实际存在。你能把这个也纠正一下吗?谢谢任何人都可以给出一些避免重复的建议吗?当标签被重复时,请给出一些停止的建议。你能说清楚吗。。。我已经删除了第一个模板中的所有职位行,即使数据被重复生成。您需要帮助我们帮助您。提供经过清理的XSLT,它实际上可以与您提供的数据匹配(您的数据中没有CTD_CTD_PKG_ID,这是正确的XSLT吗?正确的源XML?)。这样我们就可以自己测试,看看问题出在哪里。另外,不要把它当作魔术,如果
if
测试一开始就设置好了,那可能是有原因的……是的!我已经用xml提供了包id,XSLT适合我。我得到了所需的输出,没有重复。所以问题一定在别的地方。您确定您正在使用这个XSLT进行测试吗?可能您正在使用旧版本进行测试,其中您复制/粘贴了第一个