2010-03-17 18 views
14

मुझे केवल एक्सएसएलटी रूपांतरणों की सहायता से एक्सएमएल नोड्स के अंदर से एक्सप्लोर एक्सएमएल अक्षरों की आवश्यकता है। मेरे पास <text>&lt;&gt;and other possible characters</text> है और जब मैं इसे बॉडी टैग के अंदर रखता हूं तो इसे वैध स्वरूपित HTML के रूप में प्राप्त करने की आवश्यकता होती है।एक्सएसएलटी की मदद से एक्सएमएल अक्षरों को कैसे अनदेखा करें?

+0

मुझे यकीन नहीं है कि मैं समझता हूं ... < और > मान्य HTML हैं। क्या आप कह रहे हैं कि आप उन्हें HTML टैग के कुछ हिस्सों में बदलना चाहते हैं, उदा। "<i> foo </i >" 0 " foo" में परिवर्तन करें "? – wdebeaum

+0

आप बिल्कुल सही हैं! – Artic

+0

मैंने एक्सएसएल 1.0 में ऐसा करने की कोशिश की, और यह वास्तव में बुरा हो गया (2.0 थोड़ा बेहतर हो सकता है, लेकिन यह व्यापक रूप से समर्थित नहीं है)। जब तक आप अक्षम-आउटपुट-एस्केपिंग चाल नहीं कर सकते, तब तक आपको मूल रूप से प्रत्येक पाठ नोड में HTML को पार्स करना होगा और और का उपयोग करके तत्वों को पुन: निर्माण करना होगा। मान लीजिए यह एक वेब ब्राउज़र में है, हो सकता है कि आप इसे जावास्क्रिप्ट में कर सकते हैं (या यहां तक ​​कि सर्वर की ओर भी)? – wdebeaum

उत्तर

35
<xsl:template match="text"> 
    <body> 
    <xsl:value-of select="." disable-output-escaping="yes" /> 
    </body> 
</xsl:template> 

ध्यान दें कि आउटपुट अब अच्छी तरह से गठित एक्सएमएल होने की गारंटी नहीं है।

+4

मैं यह भी ध्यान दूंगा कि अक्षम-आउटपुट-एस्केपिंग एक वैकल्पिक क्रमबद्धता सुविधा है। यह एक्सएसएलटी प्रोसेसर द्वारा उदाहरण के लिए समर्थित नहीं है जैसे फ़ायरफ़ॉक्स जैसे मोज़िला ब्राउज़र में उपयोग किया जाता है क्योंकि वे सीधे परिणाम पेड़ प्रस्तुत करते हैं और इसे क्रमबद्ध नहीं करते हैं। –

+1

हैलो जब
टैग स्ट्रिंग में हुआ तब अक्षम-आउटपुट-एस्केपिंग = "हाँ" यह काम नहीं कर रहा है। –

1

मुझे इस प्रश्न का उत्तर नहीं मिला है। तो मैं इस निष्कर्ष पर आया कि ऐसा करने का कोई तरीका नहीं है। मुझे इस समस्या के लिए वर्कअराउंड मिला, सर्वर की तरफ से अनदेखी फाइल।

+0

एआरएम ... मेरे उत्तर में क्या गलत है? यह * वह तरीका है जो आप पूछते हैं। – Tomalak

+0

आपका सुझाव आउटपुट से बचने को अक्षम करता है और मुझे "" के रूप में अनदेखा प्रतीकों की आवश्यकता होती है। – Artic

+2

जो * बिल्कुल * क्या है "आउटपुट से बचने" को अक्षम करने का मतलब है। यदि आपका इनपुट सही ढंग से बच जाएगा, जो नहीं है, तो आपके पास '<' और '>' होगा, और ये '<' and '> 'पर बदल जाएंगे। और फिर आपके पास '& nbsp;' होगा, जो ' ' पर बदल जाएगा। और यह एक बिल्कुल कानूनी एचटीएमएल एस्केप अनुक्रम है जिसे "" के आगे अनुवाद की आवश्यकता नहीं है। तथ्य यह है कि आपके पास '  'का अर्थ है कि आपका इनपुट शुरू करने के लिए टूटा हुआ है। – Tomalak

3

xslt 2.0 के साथ मैं इस के साथ आया हूं। ध्यान दें कि आउटपुट को सही एक्सएमएल होने की गारंटी नहीं है, एक साधारण असमानता आपके आउटपुट को गड़बड़ कर सकती है।

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<xsl:character-map name="a"> 
    <xsl:output-character character="&lt;" string="&lt;"/> 
    <xsl:output-character character="&gt;" string="&gt;"/> 
</xsl:character-map> 

<xsl:output use-character-maps="a"/> 

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

</xsl:stylesheet> 
0

एक अन्य समाधान। यह xml पोस्टप्रोसेसर का उपयोग नहीं करता है, इसलिए आगे xslt प्रसंस्करण के इनपुट के रूप में आसानी से उपयोग करने योग्य। वैध एक्सएमएल बनाने की भी गारंटी दी। यह एक एक्सएसएलटी 2.0 समाधान है, जो "दस्तावेज़ीकरण" टैग के भीतर पाठ से बच रहा है, सैक्सन के साथ परीक्षण किया गया है। आपको अपना खुद का डेटा मॉडल परिभाषित करने के लिए "स्वीकृत टैग" चर को संशोधित करना चाहिए। तत्काल बच्चे टैग हैं, उनके नीचे वाले गुण गुण हैं। एक xsd से अनुमत टैग पढ़ना पाठक के लिए एक अभ्यास के रूप में छोड़ा गया है (कृपया इसे मेरे साथ साझा करें)।

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="http://magwas.rulez.org/my" 
> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:variable name="allowedtags"> 
<li/> 
<ul/> 
<br/> 
<a><href/></a> 
</xsl:variable> 

<xsl:template match="@*|*|processing-instruction()|comment()" mode="unescape"> 
    <xsl:copy> 
     <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()" mode="unescape"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="documentation" mode="unescape"> 
    <documentation> 
    <xsl:call-template name="doc"> 
     <xsl:with-param name="str"> 
      <xsl:value-of select="."/> 
     </xsl:with-param> 
    </xsl:call-template> 
    </documentation> 
</xsl:template> 

<xsl:template name="doc"> 
    <xsl:param name="str"/> 
    <xsl:variable name="start" select="fn:substring-before($str,'&lt;')"/> 
    <xsl:variable name="rest" select="fn:substring-after($str,'&lt;')"/> 
    <xsl:variable name="fulltag" select="fn:substring-before($rest,'&gt;')"/> 
    <xsl:variable name="tagparts" select="fn:tokenize($fulltag,'[ &#xA;]')"/> 
    <xsl:variable name="tag" select="$tagparts[1]"/> 
    <xsl:variable name="aftertag" select="fn:substring-after($rest,'&gt;')"/> 
    <xsl:variable name="intag" select="fn:substring-before($aftertag,fn:concat(fn:concat('&lt;/',$tag),'&gt;'))"/> 
    <xsl:variable name="afterall" select="fn:substring-after($aftertag,fn:concat(fn:concat('&lt;/',$tag),'&gt;'))"/> 
    <xsl:value-of select="$start"/> 
    <xsl:choose> 
    <xsl:when test="$tag"> 
     <xsl:variable name="currtag" select="$allowedtags/*[$tag = local-name()]"/> 
     <xsl:if test="$currtag"> 
      <xsl:element name="{$currtag/local-name()}"> 
       <xsl:for-each select="$tagparts[position()>1]"> 
        <xsl:variable name="anstring" select="fn:replace(.,'^([^ &#xA;=]*)=.*$','$1')"/> 
        <xsl:variable name="antag" select="$currtag/*[$anstring = local-name()]"/> 
        <xsl:if test="$antag"> 
         <xsl:attribute name="{$antag/local-name()}"> 
          <xsl:value-of select="fn:replace(.,'^.*[^ &#34;]*&#34;([^&#34;]*)&#34;.*','$1')"/> 
         </xsl:attribute> 
        </xsl:if> 
       </xsl:for-each> 
       <xsl:if test="$intag"> 
        <xsl:call-template name="doc"> 
         <xsl:with-param name="str"> 
          <xsl:value-of select="$intag"/> 
         </xsl:with-param> 
        </xsl:call-template> 
       </xsl:if> 
      </xsl:element> 
     </xsl:if> 
     <xsl:if test="$afterall"> 
      <xsl:call-template name="doc"> 
       <xsl:with-param name="str"> 
        <xsl:value-of select="$afterall"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:when> 
    <xsl:otherwise> 
        <xsl:value-of select="$str"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 
+0

'@ * | * | प्रसंस्करण-निर्देश() | टिप्पणी() 'को छोटा कर दिया जा सकता है' @ * | नोड() ' – Vampire

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