2012-01-10 33 views
-1

源结构:处理多发性项目值在XSLT与破statment

<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> 

目标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. 它必须得到非0的第一个O_VII值。
  3. 如果在O_VII中不存在除零之外的值,则需要将其替换为0.00;
  4. 如果不需要用;替换零或有效值。要求输出

例子:

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>. 
+0

有什么问题吗? – 2012-01-10 14:29:22

+1

这是一个非常严格指定的问题的例子:即使在编辑@Mads Hansen之后,源XML仍然不完整。没有提供所需的输出。问题说“a:vII字段发生0:1”。但是OP在一个非常模棱两可的评论中说:“a:VII已经出现1:1”。 -1。 – 2012-01-10 15:25:55

+0

请提供(通过编辑问题)指定源XML文档的确切需要的输出。 – 2012-01-10 17:17:26

回答

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> 
+0

a:VII发生1:1并且应该得到第一个有效值(200.00)或者如果不存在有效值并且零存在需要用(0.00) – user1140795 2012-01-10 15:10:09

+0

进行重新申请所需格式: <一个:nota_ini_one> yyyy年 yyyy年 200.00 **一个:VII具有一次出现0:1并且应该得到第一个有效值(200.00),或者如果不存在有效值并且存在零需要用(0。00) – user1140795 2012-01-10 15:30:02

+0

@ user1140795:请编辑您的问题并提供所提供源XML的确切需要的输出。你的来源和解释到目前为止是非常混乱。 – 2012-01-10 17:16:16