2010-07-07 12 views
8

से खाली टैग आउटपुट न करें मेरे पास कुछ जटिल XSLT 2.0 रूपांतरण हैं। मैं यह पता लगाने की कोशिश कर रहा हूं कि यह सुनिश्चित करने के लिए कोई सामान्य उद्देश्य तरीका है कि कोई खाली टैग आउटपुट नहीं है। तो ... अवधारणात्मक रूप से, प्रसंस्करण का एक अंतिम चरण जो सभी रिक्त टैग को दोबारा हटा देता है। मैं समझता हूं कि यह एक अलग एक्सएसएलटी द्वारा किया जा सकता है, जिसने कुछ भी खाली टैग को फ़िल्टर नहीं किया है, लेकिन मुझे इसे एक साथ एक साथ पैक करने की आवश्यकता है।दो चरण प्रसंस्करण: चरण -1 एक्सएसएलटी 2.0 प्रसंस्करण

+0

बहुत बढ़िया सवाल (+1)। एक विस्तृत समाधान के लिए मेरा जवाब देखें। –

उत्तर

8

यह 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"/> 
+0

यह कुल प्रश्न का उत्तर देता है, लेकिन यह एक विशिष्ट हिस्सा है जो याद करता है - सभी खाली टैग को दोबारा हटा रहा है ... इसलिए मुझे बस एक उचित अभिव्यक्ति के लिए "* [नहीं (नोड())]" बदलने की जरूरत है नोड्स जिनमें कोई खाली खाली वंशज नहीं है। – mentics

+0

@taotree अगली बार अपने प्रश्न को बेहतर बताएं। :) मुझे लगता है कि इस नई आवश्यकता को एक अलग प्रश्न बनाना सर्वोत्तम है - यह भी एक उत्कृष्ट सवाल होगा। आप खाली टेम्पलेट के मिलान पैटर्न के लिए इसका उपयोग कर सकते हैं: '* [नहीं (वंशज :: टेक्स्ट())]' –

+0

@taotree ने आपकी नई आवश्यकता को दर्शाने के लिए उत्तर अपडेट किया ... :) –

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