2011-06-18 14 views
5

मुझे यकीन है कि यह एक आसान है लेकिन मुझे पेड़ के लिए लकड़ी नहीं देखना है।समान विशेषता मान वाले तत्वों की गणना कैसे करें

<root> 
    <profil> 
     <e1 a="2">1</e1> 
     <m1 a="3">1</m1> 
     <e2 a="4">1</e2> 
     <m2 a="5">1</m2> 
    </profil> 
    <profil> 
     <e1 a="5">1</e1> 
     <m1 a="3">1</m1> 
     <e2 a="4">1</e2> 
     <m2 a="4">1</m2> 
    </profil> 
    <profil> 
     <e1 a="7">1</e1> 
     <m1 a="7">1</m1> 
     <e2 a="4">1</e2> 
     <m2 a="2">1</m2> 
    </profil> 
</root> 

अब मुझे पता है कि कितने/मी */@ एक ई करने के लिए */@ एक प्रति/प्रोफ़ाइल बराबर हैं हैं:

मैं एक एक्सएमएल है कि इस तरह लग रहे हो रही है। तो मैं निम्नलिखित XSLT के साथ आया था:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="*"> 
     <xsl:element name="root"> 
      <xsl:for-each select="/root/profil"> 
       <xsl:element name="count"> 
        <xsl:value-of select="count(*[contains(name(), 'm') and ./@a = //*[contains(name(),'e')]/@a])"/> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

लेकिन परिणाम गलत है:

<root> 
    <count>1</count> 
    <count>1</count> 
    <count>2</count> 
</root> 

यह होना चाहिए

<root> 
    <count>0</count> 
    <count>1</count> 
    <count>1</count> 
</root> 

किसी को भी एक सुझाव मैं गलत क्या कर रहा है क्या ?

+0

+1। –

+0

अच्छा सवाल, +1। एक पूर्ण, संक्षिप्त और आसान समाधान के लिए मेरा उत्तर देखें जो आपके मामले मानक XPath फ़ंक्शन में सबसे उपयुक्त उपयोग करता है: 'start-with() '। :) –

+0

मैंने आपके प्रश्न की बेहतर सामग्री से मेल खाने के लिए शीर्षक बदल दिया है। यदि आप इसकी परवाह करते हैं तो मूल पर वापस जाने के लिए स्वतंत्र रहें। –

उत्तर

6

सही एक है, जिसके साथ XPath बदलें:

<xsl:value-of select="count(*[substring(name(),1,1)='m' 
     and ./@a = ../*[substring(name(),1,1)='e']/@a])"/> 

मैं substring का उपयोग किया है जो एक स्ट्रिंग में किसी भी चरित्र से मेल खाता है contains के स्थान पर पहले विशेषता चरित्र मैच के लिए।

+0

अच्छा जवाब - मुझे लगता है कि 'substring' शायद' है 'से अधिक कुशल है और आपने मुझे इसे हराया :) +1 – cordsen

+0

बिल्कुल सही और भी बेहतर। धन्यवाद – Sdudda

1

मुझे लगता है कि यह है कि क्या आप

count(*[contains(name(), 'm') and (@a = parent::*/*[contains(name(),'e')]/@a)]) 

जरूरत है अपने XSLT में इस का उपयोग करते हुए

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="*"> 
     <xsl:element name="root"> 
      <xsl:for-each select="/root/profil"> 
       <xsl:element name="count"> 
        <xsl:value-of select="count(*[contains(name(), 'm') and (@a = parent::*/*[contains(name(),'e')]/@a)])"/> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

वांछित आउटपुट

<root> 
    <count>0</count> 
    <count>1</count> 
    <count>1</count> 
</root> 
+0

आपको भी धन्यवाद! मैं भी उदास काम करता हूं क्योंकि मुझे लगता है कि मैं बस उस एक्सएसएलटी को देख रहा था। सही उत्तर के लिए – Sdudda

+0

+1 –

0

उपयोग (के साथ वर्तमान नोड किसी भी profil का उत्पादन होता है तत्व):

count(*[starts-with(name(),'m') 
     and 
     @a = ../*[starts-with(name(),'e')]/@a 
     ] 
    ) 

और पूरा XSLT कोड:

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

<xsl:template match="profil"> 
    <count> 
    <xsl:value-of select= 
    "count(*[starts-with(name(),'m') 
      and 
      @a = ../*[starts-with(name(),'e')]/@a 
      ] 
     ) 
    "/> 
    </count> 
</xsl:template> 
</xsl:stylesheet> 

जब प्रदान की XML दस्तावेज़ पर लागू:

:

<root> 
    <profil> 
     <e1 a="2">1</e1> 
     <m1 a="3">1</m1> 
     <e2 a="4">1</e2> 
     <m2 a="5">1</m2> 
    </profil> 
    <profil> 
     <e1 a="5">1</e1> 
     <m1 a="3">1</m1> 
     <e2 a="4">1</e2> 
     <m2 a="4">1</m2> 
    </profil> 
    <profil> 
     <e1 a="7">1</e1> 
     <m1 a="7">1</m1> 
     <e2 a="4">1</e2> 
     <m2 a="2">1</m2> 
    </profil> 
</root> 

चाहता था, सही परिणाम का उत्पादन 01 अच्छे प्रश्न के लिए

संबंधित मुद्दे