使用break语句处理XSLT中的多个项值

时间:2012-01-10 13:15:20

标签: xslt

来源结构:

 <XML_ITEM_TAB>
    <item>
    <Field1>Yyyy</Field1>
    <Field2>Yyyy</Field2>
    <O_VII>0</O_VII>
    <Field3>Yyyy</Field3>
    <Field4>Yyyy</Field4>
    </item>
    <item>
    <Field1>Yyyy</Field1>
    <Field2>Yyyy</Field2>
    <O_VII></O_VII>
    <Field3>Yyyy</Field3>
    <Field4>Yyyy</Field4>
    </item>
    <item>
    <Field1>Yyyy</Field1>
    <Field2>Yyyy</Field2>
    <O_VII>200.00</O_VII>
    <Field3>Yyyy</Field3>
    <Field4>Yyyy</Field4>
    </item>
    <item>
    <Field1>Yyyy</Field1>
    <Field2>Yyyy</Field2>
    <O_VII>100.00</O_VII>
    <Field3>Yyyy</Field3>
    <Field4>Yyyy</Field4>
    </item>
    </XML_ITEM_TAB>

Target Strucutre:

        <a:NFeGoods>
        <a:recordset>
        <a:nota_ini_one>
        <Field3>Yyyy</Field3>
        <Field4>Yyyy</Field4>
             <a:vII>
                 <xsl:value-of select="O_VII"/>
             </a:vII>
        </a:nota_ini_one>
        </a:recordset>
        </a:NFeGoods>

XSLT中的要求:

  1. a:vII字段的出现次数为0:1。
  2. 必须获得除零之外的第一个O_VII值。
  3. 如果O_VII中不存在零以外的值,则需要将其替换为0.00;
  4. 如果不需要用;替换零或有效值。
  5. 所需输出的示例:

     1.IF valid non zero value exists:       
                <a:NFeGoods>
                <a:recordset>
                <a:nota_ini_one>
                <Field1>Yyyy</Field3>
                <Field2>Yyyy</Field4>
                <a:vII>200.00</a:vII>
                <Field3>Yyyy</Field3>
                <Field4>Yyyy</Field4>
                </a:nota_ini_one>
                </a:recordset>
                </a:NFeGoods>
     2.IF only zero value  exist for OVII field in one of the item:       
                <a:NFeGoods>
                <a:recordset>
                <a:nota_ini_one>
                <Field1>Yyyy</Field3>
                <Field2>Yyyy</Field4>
                <a:vII>0.00</a:vII>
                <Field3>Yyyy</Field3>
                <Field4>Yyyy</Field4>
                </a:nota_ini_one>
                </a:recordset>
                </a:NFeGoods>
    3.If no zero or no non zero value exist for OVII field in all items:
    
                <a:NFeGoods>
                <a:recordset>
                <a:nota_ini_one>
                <Field1>Yyyy</Field3>
                <Field2>Yyyy</Field4>
                <a:vII>;</a:vII>
                <Field3>Yyyy</Field3>
                <Field4>Yyyy</Field4>
                </a:nota_ini_one>
                </a:recordset>
                </a:NFeGoods>
    
    Also please note there are some other logic used for other nodes.So the logic need to appiled in inside node <a:vII>regured logic to get OVII value </a:vII>.
    

1 个答案:

答案 0 :(得分:0)

很难理解到底想要什么 - 只是我的猜测

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

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

 <xsl:template match="item">
  <a:recordset>
   <a:nota_ini_one>
     <xsl:apply-templates select="*[not(self::O_VII)]"/>

     <xsl:variable name="vX" select=
      "/*/*/O_VII
            [number(.) = number(.)
           and
             not(. = 0)
            ]
              [1]
      "/>
     <xsl:variable name="vZerosOnly" select="not($vX)"/>
     <a:vII>
      <xsl:value-of select=
        "concat($vX, substring('0.00;', 1 div $vZerosOnly))"/>
     </a:vII>
   </a:nota_ini_one>
  </a:recordset>
 </xsl:template>

 <xsl:template match="Field1|Field2"/>

</xsl:stylesheet>

当应用于提供的XML时(必须纠正它,因为它严重格式错误!!!):

<XML_ITEM_TAB>
    <item>
        <Field1>Yyyy</Field1>
        <Field2>Yyyy</Field2>
        <O_VII>0</O_VII>
        <Field3>Yyyy</Field3>
        <Field4>Yyyy</Field4>
    </item>
    <item>
        <Field1>Yyyy</Field1>
        <Field2>Yyyy</Field2>
        <O_VII></O_VII>
        <Field3>Yyyy</Field3>
        <Field4>Yyyy</Field4>
    </item>
    <item>
        <Field1>Yyyy</Field1>
        <Field2>Yyyy</Field2>
        <O_VII>200.00</O_VII>
        <Field3>Yyyy</Field3>
        <Field4>Yyyy</Field4>
    </item>
    <item>
        <Field1>Yyyy</Field1>
        <Field2>Yyyy</Field2>
        <O_VII>100.00</O_VII>
        <Field3>Yyyy</Field3>
        <Field4>Yyyy</Field4>
    </item>
</XML_ITEM_TAB>

结果是想要的格式

<a:NFeGoods xmlns:a="some:a">
   <a:recordset>
      <a:nota_ini_one>
         <Field3>Yyyy</Field3>
         <Field4>Yyyy</Field4>
         <a:vII>200.00</a:vII>
      </a:nota_ini_one>
   </a:recordset>
   <a:recordset>
      <a:nota_ini_one>
         <Field3>Yyyy</Field3>
         <Field4>Yyyy</Field4>
         <a:vII>200.00</a:vII>
      </a:nota_ini_one>
   </a:recordset>
   <a:recordset>
      <a:nota_ini_one>
         <Field3>Yyyy</Field3>
         <Field4>Yyyy</Field4>
         <a:vII>200.00</a:vII>
      </a:nota_ini_one>
   </a:recordset>
   <a:recordset>
      <a:nota_ini_one>
         <Field3>Yyyy</Field3>
         <Field4>Yyyy</Field4>
         <a:vII>200.00</a:vII>
      </a:nota_ini_one>
   </a:recordset>
</a:NFeGoods>