.net - एक्सएसएलटी स्वयं बंद टैग मुद्दे




xslt tags (8)

मैं एक एक्सएमएल फ़ाइल को एचटीएमएल में बदलने के लिए xslt का उपयोग कर रहा हूं। .NET xslt इंजन खाली टैग के लिए मुझे स्वयं-बंद टैग की सेवा करता रहता है।

उदाहरण:

<div class="test"></div> 

हो जाता है

<div class="test" />

पूर्व वैध एचटीएमएल है, जबकि उत्तरार्द्ध अवैध एचटीएमएल है और बुरी तरह से प्रस्तुत करता है। मेरा सवाल है: मैं स्वयं को बंद टैग का उपयोग न करने के लिए xslt इंजन (XslCompiledTransform) कैसे कहूं।

यदि यह संभव नहीं है, तो मैं स्व-समापन टैग को सही ढंग से समझने के लिए अपने ब्राउज़र (इस मामले में IE6 +) कैसे बता सकता हूं।


अपना xsl:output बदलें xsl:output विधि html ( xml बजाए) होने के लिए।

या अगर आप पहले से ही तत्व नहीं मिला है तो इसे जोड़ें

<xsl:output method="html"/>

आउटपुट / @ विधि = एचटीएमएल के साथ, PHP 5 के एक्सएसएल के साथ बस एक ही समस्या का अनुभव किया। ऐसा लगता है कि एक खाली मूल्य विशेषता असाइन करने से तत्व गैर-स्वयं-बंद होने, गैर-बंद टैग के रूप में आउटपुट होने का कारण बनेंगे:

<input type="text" name="foo" value="{my-empty-value}" />

का परिणाम:

<input type="text" name="foo" value="">

सशर्त रूप से विशेषता जोड़ने के लिए एक संभावित समाधान है:

<xsl:if test="string-length(my-empty-value) > 0">
    <xsl:attribute name="value">
        <xsl:value-of select="my-empty-value" />
    </xsl:attribute>
</xsl:if>

जिसके परिणामस्वरूप:

<input type="text" name="foo" />

गैर आत्म समापन की पीढ़ी को मजबूर करने के लिए एक टिप्पणी तत्व डालने के लिए एक कार्यवाही हो सकती है:

<script type="text/javascript" src="nowhere.js">
<xsl:comment></xsl:comment>
</script>

यह एक सुंदर soloution नहीं है, लेकिन यह काम करता है :-)

/ स्टेन


जब भी मैं तत्व को स्वयं बंद करने से रोकना चाहता हूं, तो मैं निम्न का उपयोग करता हूं:

<xsl:value-of select="''" />

यह प्रतिपादन इंजन को मूर्ख मानता है कि तत्व के अंदर सामग्री है, और इसलिए आत्म-बंद होने से बचाता है।

यह एक बदसूरत फिक्स का थोड़ा सा है इसलिए मैं इसे एक वर्णनात्मक टेम्पलेट में शामिल करने की सिफारिश करता हूं और इसके बजाय हर बार कॉल करता हूं:

<xsl:template name="PreventSelfClosure">
   <xsl:value-of select="''" />
</xsl:template>


<div class="test">
   <xsl:call-template name="PreventSelfClosure"/>
</div>

इसके बाद यह निम्नलिखित प्रस्तुत करेगा:

<div class="test"></div>

http://curtistimson.co.uk/post/xslt/how-to-prevent-self-closing-elements-in-xslt/


मैं अंदर <xsl:text> तत्व डालता था, जैसे:

<script type="text/javascript" src="/scripts/jquery.js"><xsl:text> </xsl:text></script>

मैंने पाया आसान तरीका एक नया XmlTextWriter क्लास बना रहा था, जिसने टाइप-एंडलेमेंट विधि को ओवरराइड किया, गैर-बंद टैग को मजबूर किया और पैरामीटर के रूप में क्रमबद्ध प्रक्रिया को पास किया।

public class MyXmlTextWriter : XmlTextWriter
{
    public MyXmlTextWriter(Stream stream) : base(stream, Encoding.UTF8)
    { }
    public MyXmlTextWriter(TextWriter stream) : base(stream)
    { }

    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
    }
}


सावधान रहने के लिए आपको कुछ चीजें चाहिए:

  1. अपने एक्सएसएल उपयोग <xsl: आउटपुट विधि = 'एचटीएमएल'> में
  2. अपने आउटपुट XmlWriter में आउटपुट सेटिंग्स सेट करें
  3. अपने एक्सएसएल के अंदर एचटीएमएल में, इस तरह के एचटीएमएल टैग में एचटीएमएल टैग को सेट न करें <html xmlns = "http://www.w3.org/1999/xhtml"> लेकिन इसके बजाय <html> का उपयोग करें।

यह कामकाजी कोड का एक टुकड़ा है:

string xmlStr = "<?xml version='1.0' encoding='UTF-8'?><Data></Data>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlStr);
string xslContents = @"
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'  
xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'>
<xsl:output method='html' version='4.0' omit-xml-declaration='yes' indent='yes'/>
<xsl:template match='Data'>
<html>
<body>
    <div></div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>";
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(XmlReader.Create(new StringReader(xslContents)));
StringWriter result = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(result, xsl.OutputSettings))
{
    xsl.Transform(doc, null, writer);
}
System.Diagnostics.Debug.Write( result.ToString());




xslcompiledtransform