विशेषता मान के आधार पर एक्सएमएल नोड निकालें

मैं XSL v1 का उपयोग करके विशेषता मान के आधार पर किसी xml से कुछ नोड को हटाना चाहता हूं। अब तक मुझे पता है कि यह कैसे करें ( XSLT विशेषता पर आधारित एलिमेंट निकालें )

मेरी समस्या यह है कि मैं एक्सएसएल को किसी प्रकार का सरणी/स्ट्रिंग पास करना चाहता हूं ताकि मैं एक्सएसएल को बता सकूं कि कौन सा नोड निकालना है।

उदाहरण के लिए:

एक्सएमएल:


    
        
            
            
        
        
            
            
        
        
            
            
        
        
            
            
        
    
 

XSL:


    
    
    

    
        
            
        
    

    


और जब मैं परिवर्तन को बुलाता हूं तो मैं "कोड" पैरामीटर में "ए-डी" जैसे कुछ पास कर रहा हूं। जिसके परिणामस्वरूप मैं इंतजार कर रहा हूं:


    
        
            
            
        
        
            
            
        
    

मेरी दो समस्याएं हैं:

  1. एक्सएसएल में उपयोग की जाने वाली मानों की सूची/सरणी/स्ट्रिंग को पास करने का सबसे अच्छा तरीका क्या है?
  2. मैं अपने तत्वों को फ़िल्टर करने के लिए इस सूची का उपयोग कैसे कर सकता हूं?

धन्यवाद

EDIT: I think I'm approching the solution with that XSL.


    
    

    
        
        
            
                
            
        
    

    
        
            
        
    

EDIT2:

ठीक है तो वास्तव में जो मैं करने की कोशिश कर रहा था वह ओपोजिट है, जिसका अर्थ केवल 'ए' और 'डी' नोड को ही रखना है, लेकिन समस्या एक जैसी है और जब मुझे पता चल जाएगा कि मैं कैसे करना है, तो मैं समस्या का समाधान अनुकूलित करूंगा मैंने यहां वर्णित किया है।

मैंने अपने कोड को वास्तविक सामग्री के साथ अपडेट किया है जिसके साथ मैं काम कर रहा हूं।

0
जोड़ा संपादित
विचारों: 1
@ मार्कविनेस्ट्रा "ए-डी" सिर्फ कोड की एक सूची है, यह अंतराल नहीं है, यह "ए-डी-बी" हो सकता है। जब मैं रूपांतरण चलाता हूं तो मैं अपने एक्सएसएल प्रोसेसर को कुछ पैरामीटर सेट करके इस मान को पास करता हूं: $ proc = new XSLTProcessor (); $ proc-> setParameter ('', 'code', ' ए-डी '); $ proc-> transformToXml ($ xml_doc);
जोड़ा लेखक ddattee, स्रोत
क्या आप बता सकते हैं कि पैरामीटर कैसे भर जाएगा ( )। आप कहते हैं "कुछ 'ए-डी' की तरह"। क्या आप विशिष्ट हो सकते हैं? और क्या ए-डी का अर्थ डी तक है या क्या इसका मतलब ए और डी है? क्या होगा यदि आप 4 मान पास करते हैं, तो यह कैसा दिखता है?
जोड़ा लेखक Mark Veenstra, स्रोत

3 उत्तर

एक्सएसएलटी में मूल्य प्राप्त करना

पैरामीटर

You can provide पैरामीटर to the XSLTProcessor...

$xslt = new XsltProcessor();
$xslt->importStylesheet($xslDom);
$xslt->setParameter('', 'PARAMETER_NAME', 'A D');

... जिसे स्टाइलशीट तत्व के बच्चों के रूप में एक्सएसएलटी में परिभाषित किया जा सकता है:


  default
  ...

दस्तावेज़ ()

Inside XSLT, the दस्तावेज़() function can be used to load additional xml documents. The method does only work with "constant" values. It can not be used inside a loop for example. The good thing is that it is only loaded once in the script run. Even if the template that contains the call is executed multiple times.


  
  ...

It is possible to use PHP Streamwrappers in दस्तावेज़ (). If you register your own streamwrapper you can call back inside your application.


  
  ...

PHP कॉलबैक

It is possible to call (static) PHP functions from xslt. The functions can return a DOMDocument, too. Unlike the direct दस्तावेज़() call, it is executed each time so it can use a local variable inside a loop.

$xslt = new XsltProcessor();
$xslt->importStylesheet($xslDom);
$xslt->registerPHPFunctions(array('callbackFetchingValues'));


  

फ़िल्टरिंग नोड्स

टोकन सूची

टोकन सूचीs are strings in XML, that are separated by whitespaces. The most common known is the class attribute in (X)HTML.

<div class="tokenOne tokenTwo">...</div>

To match against a टोकन सूची string you have to normalize the string, append spaces to the start and end, resulting in [space][tokenOne][space][tokenTwo][space]. After that you can check for [space][value][space]. In Xpath:

segments/segment/code[contains(concat(' ', normalize-space($TOKEN_LIST), ' '), concat(' ', @value, ' '))]

नोड सेट

If the values is a नोड सेट, you can check against it by selecting from it. You have to put your current value into a variable.


  
  
    <!-- not in filter -->
  

2
जोड़ा
बहुत बढ़िया मैं यह सब कोशिश कर रहा हूँ। धन्यवाद
जोड़ा लेखक ddattee, स्रोत

मैं finnaly यह किया था। सभी तत्वों को छोड़कर सही एक्सएसएल है लेकिन अनुमति कोड वाले लोग:


    
    
    <!-- By Default copy all elements -->
    
        
            
    
    
    <!-- For the Segment elements retreive the coresponding code and look for a match -->
    
        
        <!-- If we have valid code copy the element -->
        
            
                
            
        
    


@ मार्कविनेस्ट्रा के लिए बड़ा धन्यवाद

0
जोड़ा

जब आप पैरामीटर को सही तरीके से पास करते हैं तो निम्न XSLT चाल करेगा:

<?xml version="1.0" encoding="UTF-8"?>

    
    

    

    
        
            
        
    

    
        
             <!-- Do nothing -->
            
                
                    
                
            
        
    

XSLT के ऊपर केवल उन खंडों का उत्पादन होगा जो पैरामीटर में पारित कोड से मेल नहीं खाते हैं। यदि आप विपरीत करना चाहते हैं (केवल पैरामीटर में पारित डिस्प्ले कोड), तो बदलें:


    
         <!-- Do nothing -->
        
            
                
            
        
    

सेवा मेरे:


    
        
            
                
            
        
    

0
जोड़ा
हाय धन्यवाद मैंने असली केस सेनारियो के साथ अपनी समस्या को अपडेट किया, मैं लगभग वहां हूं लेकिन मुझे परिवर्तन से कुछ भी नहीं मिल सकता है। क्या आप मेरे आखिरी संपादन में कुछ भी देखते हैं जो सही नहीं है?
जोड़ा लेखक ddattee, स्रोत