से खाली टैग आउटपुट न करें मेरे पास कुछ जटिल XSLT 2.0 रूपांतरण हैं। मैं यह पता लगाने की कोशिश कर रहा हूं कि यह सुनिश्चित करने के लिए कोई सामान्य उद्देश्य तरीका है कि कोई खाली टैग आउटपुट नहीं है। तो ... अवधारणात्मक रूप से, प्रसंस्करण का एक अंतिम चरण जो सभी रिक्त टैग को दोबारा हटा देता है। मैं समझता हूं कि यह एक अलग एक्सएसएलटी द्वारा किया जा सकता है, जिसने कुछ भी खाली टैग को फ़िल्टर नहीं किया है, लेकिन मुझे इसे एक साथ एक साथ पैक करने की आवश्यकता है।दो चरण प्रसंस्करण: चरण -1 एक्सएसएलटी 2.0 प्रसंस्करण
उत्तर
यह XSLT 2.0 परिवर्तन दर्शाता है कि बहु-पास (इस मामले 2-पारण में) प्रसंस्करण किया जा सकता है:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates select="$vPass1/*" mode="non-empty"/>
</xsl:template>
<xsl:template match="text()[xs:integer(.) mod 2 eq 0]"/>
<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>
जब इस XML दस्तावेज़ पर लागू:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
यह पहले पास में परिणाम दस्तावेज़ बनाता है (जिसे $vPass1
चर में कैद किया गया है), जिसमें सामग्री के साथ सभी <num>
तत्व भी पूर्णांक होते हैं आर उनकी सामग्री को छीन लिया गया है और खाली हैं। फिर, दूसरे पास में, एक विशिष्ट मोड में लागू, सभी खाली तत्व हटा दिए जाते हैं।
परिवर्तन का परिणाम है:
<nums>
<num>01</num>
<num>03</num>
<num>05</num>
<num>07</num>
<num>09</num>
</nums>
ध्यान दें करो मोड के उपयोग, और विशेष मोड #all
और #current
।
अद्यतन: ओपी अब सभी रिकॉर्ड्स को "रिकर्सिवली" "हटाने के लिए एक टिप्पणी में चाहता है जिसमें कोई खाली खाली वंशज नहीं है"।
इसे स्पष्ट पुनरावृत्ति का उपयोग करके सरल लागू किया जा सकता है। बस बदलने के लिए:
<xsl:template match="*[not(node())]" mode="non-empty"/>
रहे हैं:
<xsl:template match="*[not(descendant::text())]" mode="non-empty"/>
यह कुल प्रश्न का उत्तर देता है, लेकिन यह एक विशिष्ट हिस्सा है जो याद करता है - सभी खाली टैग को दोबारा हटा रहा है ... इसलिए मुझे बस एक उचित अभिव्यक्ति के लिए "* [नहीं (नोड())]" बदलने की जरूरत है नोड्स जिनमें कोई खाली खाली वंशज नहीं है। – mentics
@taotree अगली बार अपने प्रश्न को बेहतर बताएं। :) मुझे लगता है कि इस नई आवश्यकता को एक अलग प्रश्न बनाना सर्वोत्तम है - यह भी एक उत्कृष्ट सवाल होगा। आप खाली टेम्पलेट के मिलान पैटर्न के लिए इसका उपयोग कर सकते हैं: '* [नहीं (वंशज :: टेक्स्ट())]' –
@taotree ने आपकी नई आवश्यकता को दर्शाने के लिए उत्तर अपडेट किया ... :) –
- 1. प्रसंस्करण 2.0
- 2. दो चरण प्रतिबद्ध
- 3. सिम्फनी 2.0 चरण-दर-चरण ट्यूटोरियल की आवश्यकता है
- 4. चरण-दर-चरण: ग्राहक आईडीई
- 5. चरण
- 6. चरण
- 7. चरण
- 8. प्रसंस्करण
- 9. मेवेन चरण दो बार निष्पादित
- 10. JAXB प्रसंस्करण
- 11. AppEngine: चरण-दर-चरण डिबगिंग
- 12. मेवेन + जीएई चरण-दर-चरण
- 13. छवि प्रसंस्करण पुस्तकालय
- 14. फेसबुक ऑफलाइन एक्सेस चरण-दर-चरण
- 15. एक चरण
- 16. चरण-दर-चरण एएसपी.नेट स्वचालित बिल्ड/तैनाती
- 17. राइनो मोक्स चरण-दर-चरण ट्यूटोरियल
- 18. दो चरण लुकअप - स्पष्टीकरण की आवश्यकता
- 19. उद्देश्य सी वस्तुओं के दो चरण निर्माण
- 20. कॉपी चरण
- 21. एमएसबिल्ड चरण
- 22. स्वच्छ चरण
- 23. चरण सहसंबंध
- 24. संकलन चरण
- 25. Django - चरण
- 26. एकल चरण
- 27. चरण - उपयोगकर्ता
- 28. ककड़ी चरण
- 29. एक चरण
- 30. प्रसंस्करण/Arduino
बहुत बढ़िया सवाल (+1)। एक विस्तृत समाधान के लिए मेरा जवाब देखें। –