2010-08-14 25 views
5

Bir XSL geliştirmesi üzerinde çalışıyorum ve XPATH'de NOT IN eşdeğerini bilmem gerekiyor. XML ve XSL'yi herkes için anlaşılabilir en basit biçimde sunuyorum.XPath ifadesinde eşdeğer değil

<?xml-stylesheet type="text/xsl" href="XSL.xsl"?> 
<Message> 
    <Customers> 
     <Customer pin="06067">1</Customer> 
     <Customer pin="06068">2</Customer> 
     <Customer pin="06069">3</Customer> 
     <Customer pin="06070">4</Customer> 
     <Customer pin="06072">5</Customer> 
    </Customers> 
    <Addresses> 
     <Address pin1="06067">A</Address> 
     <Address pin1="06068">B</Address> 
     <Address pin1="06069">C</Address> 
    </Addresses> 
</Message> 

<xsl:template match="/Message"> 
    <html> 
     <body> 
      <h4>Existing Customers</h4> 
      <table> 
       <xsl:apply-templates select="//Customers/Customer[@pin = //Addresses/Address/@pin1]"></xsl:apply-templates> 
      </table> 

      <h4>New Customers</h4> 
      <table> 
       <!--This place need to be filled with new customers--> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="Customer" name="Customer"> 
    <xsl:variable name="pin" select="./@pin"></xsl:variable> 
    <tr> 
     <td> 
      <xsl:value-of select="."/> 
      <xsl:text> is in </xsl:text> 
      <xsl:value-of select="//Addresses/Address[@pin1=$pin]"/> 
     </td> 
    </tr> 
</xsl:template> 
Yukarıdaki XSLT'de

, yorumladı alanının altındaki, i E mevcut değil mi müşteriler olmalıdır ve gereken göstermek XSL Adresler/Adres düğümü.

Adresler Düğüm setinde OLMAYAN Müşterilerle eşleşecek bir XPath ifadesi bulmaya yardım edin. XPath 1.0 olarak

+0

İyi soru (1). Verimli, kısa ve basit bir XSLT çözümü için cevabımı görün. :) –

cevap

7

(Herhangi alternatif de yardımcı olabilir):

/Message/Customers/Customer[not(@pin=/Message/Addresses/Address/@pin1)] 
+0

Vay işe yarıyor. Çok teşekkür ederim. – SaravananArumugam

+0

@Saravanandss: Çok iyisiniz! –

+0

+1. Bu temel XPath bilgisidir - ne yazık ki OP, "işe yaradığı" ndan mutludur ve muhtemelen gerçekte ne olduğunu anlamak için daha fazla düşünmezdi ... :( –

4

Ben upvoted @Alejandro, tarafından iyi cevap alternatifi anahtarlarını kullanır ve olacak aşağıdaki dönüştürme işidir daha verimli mevcut müşteri sayısı büyük ise: Bu dönüşüm sağlanan XML belgesinin 01 uygulanır

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

    <xsl:key name="kexistingByPin" 
     match="Address" use="@pin1"/> 

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

<xsl:template match="/"> 
    <xsl:apply-templates select= 
    "*/*/Customer[not(key('kexistingByPin', @pin))]"/> 
</xsl:template> 
</xsl:stylesheet> 

: İstenen, doğru cevap üretilir

<Message> 
    <Customers> 
     <Customer pin="06067">1</Customer> 
     <Customer pin="06068">2</Customer> 
     <Customer pin="06069">3</Customer> 
     <Customer pin="06070">4</Customer> 
     <Customer pin="06072">5</Customer> 
    </Customers> 
    <Addresses> 
     <Address pin1="06067">A</Address> 
     <Address pin1="06068">B</Address> 
     <Address pin1="06069">C</Address> 
    </Addresses> 
</Message> 

:

<Customer pin="06070">4</Customer> 
<Customer pin="06072">5</Customer>