मैं एकाधिक शर्त के आधार पर नोड्स फ़िल्टर करना चाहता हूं।

<SHOP>
   <zasoba>
      <kod>10000</kod>
      <vyrobca>APPLE</vyrobca>
      <kategorie>
         <kategoria>GOOD</kategoria>
      </kategorie>
      <obrazky/>
   </zasoba>
   <zasoba>
      <kod>365</kod>
      <vyrobca>HUAWEI</vyrobca>
      <kategorie>
         <kategoria>SOMETHING</kategoria>
      </kategorie>
   </zasoba>
   <zasoba>
      <kod>999</kod>
      <vyrobca>HUAWEI</vyrobca>
      <kategorie>
         <kategoria>SOMETHING</kategoria>
      </kategorie>
   </zasoba>
   <zasoba>
      <kod>90000</kod>
      <vyrobca>APPLE</vyrobca>
      <kategorie>
         <kategoria>SECONDGOOD</kategoria>
      </kategorie>
      <obrazky/>
   </zasoba>
   <zasoba>
      <kod>304-R-MK</kod>
      <vyrobca>APPLE</vyrobca>
      <kategorie>
         <kategoria>NOTGOOD</kategoria>
      </kategorie>
   </zasoba>
</SHOP>

शर्त:

  • आइटम को आउटपुट में रखें यदि <vyrobca> = APPLE और kategorie/kategoria = GOOD या SECONDGOOD। किसी अन्य को हटा दें जहां <vyrobca> = Apple और kategorie/kategoria GOOD या SECONDGOOD के अलावा कोई अन्य मान है। व्याख्या: मैं इन दो श्रेणियों में से आउटपुट में सभी ऐप्पल आइटम छोड़ना चाहता हूं।

  • शर्त का दूसरा भाग: आउटपुट में सब कुछ छोड़ दें जब <vyrobca> = HUAWEI. kategorie/kategoria कोई फर्क नहीं पड़ता।

उपरोक्त इनपुट से उदाहरण आउटपुट:

<SHOP>
   <zasoba>
      <kod>10000</kod>
      <vyrobca>APPLE</vyrobca>
      <kategorie>
         <kategoria>GOOD</kategoria>
      </kategorie>
      <obrazky/>
   </zasoba>
   <zasoba>
      <kod>365</kod>
      <vyrobca>HUAWEI</vyrobca>
      <kategorie>
         <kategoria>SOMETHING</kategoria>
      </kategorie>
   </zasoba>
   <zasoba>
      <kod>999</kod>
      <vyrobca>HUAWEI</vyrobca>
      <kategorie>
         <kategoria>SOMETHING</kategoria>
      </kategorie>
   </zasoba>
   <zasoba>
      <kod>90000</kod>
      <vyrobca>APPLE</vyrobca>
      <kategorie>
         <kategoria>SECONDGOOD</kategoria>
      </kategorie>
      <obrazky/>
   </zasoba>
</SHOP>

मैं इस मैच का उपयोग करने की कोशिश कर रहा हूं:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/>

    <xsl:strip-space elements="*" />

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

 <xsl:template match="zasoba[(not(vyrobca = 'APPLE') and not(kategorie/kategoria = 'GOOD' or kategorie/kategoria = 'SECONDGOOD')) or not(vyrobca = 'HUAWEI')]" />
</xsl:stylesheet>

लेकिन काम नहीं करता। ऑपरेटरों को इस तरह जोड़ा नहीं जा सकता है? मैंने सोचा था कि (not(vyrobca = 'APPLE') and not(kategorie/kategoria = 'GOOD' or kategorie/kategoria = 'SECONDGOOD')) काम करना चाहिए, जहां मैंने ऐप्पल और दो श्रेणियों के लिए अपवाद बनाया।

2
Bohumír Mäsiar 21 नवम्बर 2019, 20:20

1 उत्तर

सबसे बढ़िया उत्तर

इसे अपने दूसरे टेम्पलेट के रूप में आज़माएं:

<xsl:template match="zasoba[not(vyrobca = 'APPLE' and (kategorie/kategoria = 'GOOD' or kategorie/kategoria = 'SECONDGOOD') or vyrobca = 'HUAWEI')]" />

स्पष्टीकरण:

आप निम्न शर्तों को पूरा करने वाले zasoba नोड्स को शामिल करना चाहते हैं:

vyrobca = 'APPLE' and (kategorie/kategoria = 'GOOD' or kategorie/kategoria = 'SECONDGOOD') 
or 
vyrobca = 'HUAWEI'

इसे नोड्स के बहिष्कृत के विधेय के रूप में फिर से लिखने के लिए, हमें केवल not() में संपूर्ण व्यंजक को लपेटने की आवश्यकता है।

आपके पास:

(not(vyrobca = 'APPLE') and not(kategorie/kategoria = 'GOOD' or kategorie/kategoria = 'SECONDGOOD')) or not(vyrobca = 'HUAWEI')

इसे बेहतर ढंग से समझने के लिए, आइए kategorie/kategoria के बारे में भाग और निरर्थक कोष्ठकों को छोड़ दें। यह साथ छोड़ देता है:

not(vyrobca = 'APPLE') or not(vyrobca = 'HUAWEI')

जो, DeMorgan के नियमों के अनुसार, इसके समतुल्य है:

not ( vyrobca = 'APPLE' and vyrobca = 'HUAWEI' )

और यह निश्चित रूप से किसी एकल निर्माता के साथ किसी भी उत्पाद के लिए सही है।

2
michael.hor257k 22 नवम्बर 2019, 00:25