работа со значениями Mutiple Item в XSLT с разметкой разрыва - PullRequest
0 голосов
/ 10 января 2012

Исходная структура:

 <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. Он должен получить первое 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>.

1 Ответ

0 голосов
/ 10 января 2012

Очень трудно понять, что именно нужно - просто мое предположение :

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...