XSLT में एक नई लाइन का निर्माण


198

मैं XSLT में टेक्स्ट आउटपुट के लिए एक नई लाइन का उत्पादन करना चाहता हूं। कोई विचार?


11
मुझे लगता है, यह उत्तर स्वीकार करने का समय है :)
फ्लोरजन

जवाबों:


240

निम्नलिखित XSL कोड एक नई लाइन (लाइन फीड) चरित्र का उत्पादन करेगा :

<xsl:text>&#xa;</xsl:text>

एक के लिए गाड़ी वापसी , का उपयोग करें:

<xsl:text>&#xd;</xsl:text>

7
+1: <xsl:text>यदि आप ऐसी किसी भी चीज़ का उपयोग करते हैं, जो आपकी XSL फ़ाइल को पुन: स्वरूपित कर सकती है और व्हाट्सएप के साथ गड़बड़ी करती है, तो यह अधिक मजबूत है ।
इयान रॉबर्ट्स

49

ऐसा करने के लिए मेरा पसंदीदा तरीका कुछ इस तरह है:

<xsl:stylesheet>

<xsl:output method='text'/>

<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>

<!-- note that the layout there is deliberate -->

...

</xsl:stylesheet>

फिर, जब भी आप एक नईलाइन (शायद सीएसवी में) आउटपुट करना चाहते हैं, तो आप निम्न की तरह कुछ आउटपुट कर सकते हैं:

<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />

मैंने इस तकनीक का उपयोग तब किया है जब xml इनपुट से sql आउटपुट करता है। वास्तव में, मैं अल्पविराम, उद्धरण और newlines के लिए चर बनाने के लिए करते हैं।


3
कृपया ध्यान दें कि नीचे दिए गए फ्लोरजन का जवाब मेरे मुकाबले काफी स्थिर है।
निक गिब्सन

1
यह संभवतः वृद्धि की स्थिरता के लिए तत्व में घोषणा xml:space="preserve"को जोड़ने के लायक xsl:textहै, लेकिन मैं इस बात से सहमत हूं कि @ फ्लोरजन का जवाब शायद सुरक्षित है।
फ्लिन 1179

इस समाधान में किसी इंडेंटेशन सहित कमियां भी हैं, जो वांछनीय नहीं हो सकती हैं।
wassassingham

47

एक्सएसएल पर आउटपुट मेथड = "टेक्स्ट" शामिल करें: आउटपुट टैग और उचित बिंदुओं पर एक्सएसएल में अपनी शाब्दिक सामग्री में नईलाइन शामिल करें। यदि आप अपने XSL के स्रोत कोड को उस इकाई का उपयोग करना पसंद करते हैं &#10;जहाँ आप एक नई लाइन चाहते हैं।


31

आप उपयोग कर सकते हैं: <xsl:text>&#10;</xsl:text>

उदाहरण देखें

<xsl:variable name="module-info">
  <xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
  <xsl:text>&#10;</xsl:text>
</xsl:variable>

यदि आप इसे फ़ाइल में लिखते हैं जैसे

<redirect:write file="temp.prop" append="true">
  <xsl:value-of select="$module-info" />
</redirect:write>

इस चर के रूप में एक नई लाइन का उत्पादन होगा:

commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4

6

IMF को @Florjon द्वारा दी गई जानकारी से अधिक जानकारी की आवश्यकता नहीं है। शायद कुछ छोटे विवरण यह समझने के लिए छोड़ दिए जाते हैं कि यह कभी-कभी हमारे लिए काम क्यों नहीं कर सकता है।

सबसे पहले, एक इच्छा के अंदर &#xa(हेक्स) या &#10(डिक) <xsl:text/>हमेशा काम करेगा, लेकिन आप इसे नहीं देख सकते हैं।

  1. HTML मार्कअप में कोई नईलाइन नहीं है। एक साधारण का उपयोग <br/>करना ठीक होगा। अन्यथा आपको एक सफेद स्थान दिखाई देगा। ब्राउज़र से स्रोत को देखने से आपको पता चल जाएगा कि वास्तव में क्या हुआ था। हालांकि, ऐसे मामले हैं जो आप इस व्यवहार की अपेक्षा करते हैं, खासकर अगर उपभोक्ता सीधे ब्राउज़र नहीं है। उदाहरण के लिए, आप एक HTML पेज बनाना चाहते हैं और इसकी संरचना को अच्छी तरह से तैयार करना चाहते हैं ताकि ब्राउज़र को इसे परोसने से पहले खाली लाइनों और आइडेंट के साथ तैयार किया जा सके।
  2. याद रखें कि आपको कहां उपयोग करने की आवश्यकता है disable-output-escapingऔर कहां नहीं। निम्नलिखित उदाहरण लें जहां मुझे दूसरे से एक xml बनाना था और एक स्टाइलशीट से इसके DTD की घोषणा करनी थी।

पहला संस्करण पात्रों से बचता है (xsl के लिए डिफ़ॉल्ट: पाठ)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>

    <xsl:template match="/">
        <xsl:text>&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>
        <xsl:copy>
            <xsl:apply-templates select="*" mode="copy"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*|node()" mode="copy">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="copy"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

और यहाँ परिणाम है:

<?xml version="1.0" encoding="utf-8"?>
&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;

&#13;<Subscriptions>
    <User id="1"/>   
</Subscriptions>

ठीक है, यह वही करता है जो हम उम्मीद करते हैं, बचने के लिए किया जाता है ताकि हमारे द्वारा उपयोग किए गए वर्ण ठीक से प्रदर्शित हों। रूट नोड के अंदर XML भाग प्रारूपण द्वारा नियंत्रित किया जाता है ident="yes"लेकिन करीब से देखने पर हम देखते हैं कि न्यूलाइन वर्ण &#xaबच नहीं रहा था और जैसा अनुवाद किया गया है, एक डबल लाइनफीड प्रदर्शन कर रहा है! मेरे पास इस पर कोई स्पष्टीकरण नहीं है, यह जानना अच्छा होगा। किसी को?

दूसरा संस्करण वर्णों से नहीं बचता है, इसलिए वे उत्पादन कर रहे हैं जो वे लिए हैं। किया गया परिवर्तन था:

<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>

और यहाँ परिणाम है:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">

<Subscriptions>
    <User id="1"/>   
</Subscriptions>

और यह ठीक होगा। Cr और lf दोनों को ठीक से प्रस्तुत किया गया है।

  1. मत भूलो हम बात कर रहे हैं nl, नहीं crlf( nl=lf)। मेरा पहला प्रयास केवल cr का उपयोग करना था:&#xd और जबकि आउटपुट xml को DOM द्वारा ठीक से मान्य किया गया था।

मैं एक भ्रष्ट xml देख रहा था:

<?xml version="1.0" encoding="utf-8"?>
<Subscriptions>riptions SYSTEM "Subscriptions.dtd">
    <User id="1"/>   
</Subscriptions>

DOM पार्सर नियंत्रण वर्णों की अवहेलना करता है लेकिन प्रदान नहीं किया गया। मैंने अपना सिर उछालने में काफी समय बिताया, इससे पहले कि मुझे एहसास होता कि मैं कितना मूर्ख नहीं हूँ!

रिकॉर्ड के लिए, मैं दोनों CRLF के साथ शरीर के अंदर एक चर का उपयोग करता हूं सिर्फ 100% सुनिश्चित करने के लिए कि यह हर जगह काम करेगा।


4

मैंने DOCTYPEआपके द्वारा यहां देखा गया निर्देश जोड़ा :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nl "&#xa;">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

यह मुझे आउटपुट में एक नई लाइन बनाने के &nl;बजाय उपयोग करने की अनुमति देता है &#xa;। अन्य समाधानों की तरह, यह आमतौर पर एक <xsl:text>टैग के अंदर रखा जाता है ।


3

तुम कोशिश कर सकते हो,

<xsl:text>&#xA;</xsl:text>

यह काम करेगा।


2

मैं निक गिब्सन का दूसरा तरीका, यह हमेशा मेरा पसंदीदा था:

<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>

हालांकि मैं स्टाइल टास्क बनाने और उन्हें फाइलों के खिलाफ चलाने के लिए चींटी टास्क <इकोक्लेम> का इस्तेमाल कर रहा हूं। कार्य विशेषता मान टेम्पलेट करेगा, जैसे $ {DSTAMP}, लेकिन यह आपके xml को भी पुन: स्वरूपित करेगा, इसलिए कुछ मामलों में, इकाई संदर्भ बेहतर है।

<xsl:variable name='nl'><xsl:text>&#xa;</xsl:text></xsl:variable>

3
यदि आप एक चर का उपयोग करते हैं, तो selectइसके बजाय इसका उपयोग करना बेहतर होगा xsl:text। उदाहरण: <xsl:variable name="nl" select="'&#xA;'"/>इस तरह आप एक अनावश्यक RTF (परिणाम वृक्ष का टुकड़ा) नहीं बनाते हैं।
डैनियल हेली

2

मुझे शाब्दिक newlines में <xsl:text>और शाब्दिक newlines का उपयोग करने के बीच अंतर मिला है &#xA;

जबकि शाब्दिक नईलाइन्स ने मेरे वातावरण में अच्छा काम किया (सैक्सन और डिफ़ॉल्ट जावा एक्सएसएलटी प्रोसेसर दोनों का उपयोग करके) मेरा कोड तब विफल हुआ जब इसे .NET वातावरण में चल रहे दूसरे समूह द्वारा निष्पादित किया गया था।

संस्थाओं में परिवर्तन ( &#xA;) जावा और .NET दोनों पर मेरी फ़ाइल पीढ़ी कोड लगातार चल रहा है।

इसके अलावा, शाब्दिक नई आईडी आईडीई द्वारा सुधार किए जाने के लिए कमजोर हैं और अनजाने में खो सकती है जब फ़ाइल किसी व्यक्ति द्वारा 'पता नहीं' में बनाए रखी जाती है।


2

मैं अपने अनुभव है कि एक नई लाइन का निर्माण करने से ध्यान दिया है अंदर एक <xsl:variable>खंड काम नहीं करता है। मैं कुछ ऐसा करने की कोशिश कर रहा था:

<xsl:variable name="myVar">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
      <xsl:text></xsl:text> <!--NEW LINE-->
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<div>
  <xsl:value-of select="$myVar"/>
</div>

जो भी मैंने उस "नई लाइन" (खाली <xsl:text>नोड) में डालने की कोशिश की, बस काम नहीं किया (इस पृष्ठ में अधिकांश सरल सुझावों सहित), इस तथ्य का उल्लेख नहीं करने के लिए कि HTML अभी वहां काम नहीं करेगा, इसलिए अंततः मैं इसे 2 चरों में विभाजित करना था, उन्हें <xsl:variable>दायरे से बाहर बुलाएं और <br/>उनके बीच एक सादा करें, अर्थात:

<xsl:variable name="myVar1">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<xsl:variable name="myVar2">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<div>
  <xsl:value-of select="$myVar1"/>
  <br/>
  <xsl:value-of select="$myVar2"/>
</div>

हाँ, मुझे पता है, यह सबसे परिष्कृत समाधान नहीं है, लेकिन यह काम करता है, बस अपने हताशा के अनुभव को एक्सएसएल के साथ साझा करना ;)


2

मैं सिर्फ <xsl:text>&#xa;</xsl:text>एप्रोच का उपयोग नहीं कर सकता क्योंकि अगर मैं एक्सएसएलटी का उपयोग करके एक्सएमएल फाइल को फॉर्मेट कर देता हूं तो यूनिट गायब हो जाएगी। इसलिए मुझे चर का उपयोग करते हुए दृष्टिकोण के बारे में थोड़ा और गोल उपयोग करना पड़ा

<xsl:variable name="nl" select="'&#10;'"/>
<xsl:template match="/">
    <xsl:value-of select="$nl" disable-output-escaping="no"/>
    <xsl:apply-templates select="*"/>
</xsl:template>

-4

बस इस टैग को जोड़ें:

<br/>

इससे मेरा काम बनता है ;) ।


7
प्रश्न टेक्स्ट आउटपुट के बारे में है। यदि HTML के रूप में आउटपुट प्रदान किया गया था तो आपका समाधान केवल तभी काम करेगा।
oberlies
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.