2016-04-11 34 views
0

Açıklama:katları 'değil' IF içinde condtions (XSLT)

ben niteliği ve gelen alanın değerini kontrol etmem gereken bir şartı var ve her ikisi de NULL değilse ben bu değerleri doldurmak çıktı.

Sorun: değerlerden biri bile geçirildiğinde ben çıktı alıyorum

(öznitelik veya gerçek alan değeri olarak). Bu, giriş xml'lerinin "her ikisi" için çalışmak için 've' koşuluna ihtiyaç duyduğum durum olmamalıdır.

ilk:

<a> 
    <b Ccy="INR">999.000</b> 
</a> 

ikinci: Kullanılan

<v> 
    <z Ccy="USD">9999.000</z> 
</v> 

Kodu:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    exclude-result-prefixes="fo"> 
    <xsl:output encoding="UTF-8" 
       version="1.0" 
       method="xml" 
       indent="yes"/> 
    <xsl:template match="/"> 
    <xsl:variable name="ccy1" 
     select="./*[local-name()='a'] 
       /*[local-name()='b'] 
       /@*[local-name()='Ccy']"/> 
    <xsl:variable name="field1" 
     select="./*[local-name()='a'] 
       /*[local-name()='b']"/> 
    <xsl:variable name="ccy2" 
     select="./*[local-name()='v'] 
       /*[local-name()='z'] 
       /@*[local-name()='Ccy']"/> 
    <xsl:variable name="field2" 
     select="./*[local-name()='v'] 
       /*[local-name()='z']"/> 
    <xsl:if test="not($ccy1 = '') 
        and not($field1 = '') 
        or not($ccy2 = '') 
        and not($field2 = '')"> 
     <output Ccy="AAA"> 
     <xsl:choose> 
      <xsl:when test="$ccy1 and $field1"> 
      <xsl:attribute name="Ccy"> 
       <xsl:value-of select="$ccy1"/> 
      </xsl:attribute> 
      <xsl:value-of select="$field1"/> 
      </xsl:when> 
      <xsl:when test="$ccy2 and $field2"> 
      <xsl:attribute name="Ccy"> 
       <xsl:value-of select="$ccy2"/> 
      </xsl:attribute> 
      <xsl:value-of select="$field2"/> 
      </xsl:when> 
     </xsl:choose> 
     </output> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 
+1

Neden '* [yerel-name() = 'a']' gibi korkunç kesmek kullanmak istiyorsunuz? XPath almak için olağan bir yol olan –

+0

değil mi? –

+0

Hayır, öyle değil. 'A' ya da - '' '' '' '' '' '' '' '' '' (ns1 'a önekine isim verdikten sonra,' ns1 'önekine isim verin). –

cevap

0

sizin yaklaşımdaki sorun olduğunu

Ben iki giriş xml boş bir düğüm kümesi n bir dizeye eşittir - boş bir dizge bile değil. Bu nedenle, ilk örneğinizde, not($ccy2 = '') and not($field2 = '')" ifadesi, gerçek giriş düğümlerinin boş olup olmadığına bakılmaksızın true() olarak değerlendirilir.

yerine deneyin: Yeryüzünde

<xsl:if test="string($ccy1) and string($field1) or string($ccy2) and string($field2)"> 
+0

Hızlı yanıt için teşekkürler –