2011-01-30 10 views
26

मैं पंक्तियों <br /> द्वारा अलग में अर्धविराम (;) पर कोई पता विभाजित करना चाहते हैं यदि address = 123 Elm Street, मैं,xsl: तारों को कैसे विभाजित करें?</p> <p>उदहारण के लिए:

उत्पादन 123 Elm Street करना चाहते हैं लेकिन अगर address = 123 Elm Street;PO Box 222, मैं उत्पादन

123 Elm Street<br />PO Box 222 

करना चाहते हैं और अगर address = 123 Elm Street;PO Box 222;c/o James Jones, मैं उत्पादन करना चाहते हैं

123 Elm Street<br />PO Box 222<br />c/o James Jones 

है ऐसा करने का कोई तरीका है? (शायद आसान है, लेकिन मैं XSLT के साथ कि परिचित नहीं हूँ)

सादा XSL चयनकर्ता

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

है और मैं अर्धविराम पर विभाजित करने के लिए इस XSLT टुकड़ा संशोधित करना चाहते हैं।


अद्यतन: जाहिरा तौर पर इस सवाल का जवाब <xsl:call-template> के उपयोग और कार्यों substring-before() और substring-after() शामिल है।

लेकिन मैं एक्सएसएलटी के लिए शुरुआत करने वाला हूं और मैं वास्तव में ऐसा करने के लिए कुछ मदद का उपयोग कर सकता हूं।

+0

[करता XSLT के संभावित डुप्लिकेट एक स्प्लिट() फ़ंक्शन है?] (http://stackoverflow.com/questions/136500/does-xslt-have-a-split- कार्यक्षमता) – porges

+0

शायद यह निकट-डुप्लिकेट है, लेकिन मैं यह नहीं समझ सकता कि उस समस्या के उत्तर को मेरी समस्या के लिए कैसे लागू किया जाए। –

+0

यह भी देखें http://stackoverflow.com/questions/10750184/looping-through-multiple-sequences-from-strtokenize – Vadzim

उत्तर

52

मैं सादा XSLT 1.0 समाधान:

यह परिवर्तन:

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

<xsl:template match="text()" name="split"> 
    <xsl:param name="pText" select="."/> 
    <xsl:if test="string-length($pText)"> 
    <xsl:if test="not($pText=.)"> 
    <br /> 
    </xsl:if> 
    <xsl:value-of select= 
    "substring-before(concat($pText,';'),';')"/> 
    <xsl:call-template name="split"> 
    <xsl:with-param name="pText" select= 
    "substring-after($pText, ';')"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

जब इस XML दस्तावेज़ पर लागू:

<t>123 Elm Street;PO Box 222;c/o James Jones</t> 

चाहता था, को सही परिणाम पैदा करता है:

123 Elm Street<br />PO Box 222<br />c/o James Jones 

II। FXSL 1 (XSLT 1.0 के लिए):

यहाँ हम सिर्फ FXSL टेम्पलेट str-map का उपयोग करें (और 999 बार के लिए पुनरावर्ती टेम्पलेट लिखने के लिए नहीं है): जब इस बदलाव है

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:f="http://fxsl.sf.net/" 
xmlns:testmap="testmap" 
exclude-result-prefixes="xsl f testmap" 
> 
    <xsl:import href="str-dvc-map.xsl"/> 

    <testmap:testmap/> 

    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/> 
    <xsl:call-template name="str-map"> 
     <xsl:with-param name="pFun" select="$vTestMap"/> 
     <xsl:with-param name="pStr" select= 
     "'123 Elm Street;PO Box 222;c/o James Jones'"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="replace" mode="f:FXSL" 
     match="*[namespace-uri() = 'testmap']"> 
     <xsl:param name="arg1"/> 

     <xsl:choose> 
     <xsl:when test="not($arg1=';')"> 
     <xsl:value-of select="$arg1"/> 
     </xsl:when> 
     <xsl:otherwise><br /></xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

किसी भी XML दस्तावेज़ (इस्तेमाल नहीं किया), एक ही पर लागू किया, चाहता था सही परिणाम उत्पादन किया जाता है:

123 Elm Street<br/>PO Box 222<br/>c/o James Jones 

III। एक्सएसएलटी 2 का उपयोग करना।0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="text()"> 
    <xsl:for-each select="tokenize(.,';')"> 
    <xsl:sequence select="."/> 
    <xsl:if test="not(position() eq last())"><br /></xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव इस XML दस्तावेज़ पर लागू किया जाता है:

<t>123 Elm Street;PO Box 222;c/o James Jones</t> 

चाहता था, सही परिणाम उत्पादन किया जाता है:

123 Elm Street<br />PO Box 222<br />c/o James Jones 
+0

क्या आप 'नहीं ($ pText =।)' वाक्यविन्यास समझा सकते हैं? 'क्या कर रहा है? –

+3

@ जेसन-एस: '.' एक्सएसएलटी (और XPath में) का मतलब वर्तमान नोड (संदर्भ नोड) है। 'नहीं ($ pText =।)' सत्य है() 'यदि पैरामीटर' $ pText' का स्ट्रिंग मान वर्तमान नोड के स्ट्रिंग मान के बराबर नहीं है - हम केवल इस मामले में '
' आउटपुट करना चाहते हैं , अन्यथा हमारा आउटपुट '
' –

+0

से शुरू होगा, क्या मैं पहले से ही मौजूदा चर को param name = "pText" में पास कर सकता हूं? – Perdomoff

1

यदि आपका एक्सएसएलटी प्रोसेसर EXSLT का समर्थन करता है, तो आप str:tokenize का उपयोग कर सकते हैं, अन्यथा, लिंक में सबस्ट्रिंग-जैसे कार्यों का उपयोग करके कार्यान्वयन होता है।

+0

मुझे कैसे पता चलेगा? मेरा एक्सएसएलटी प्रोसेसर एक वेब ब्राउजर है, या तो फ़ायरफ़ॉक्स 3.6 या सफारी 5.0 –

+2

@ जेसन एस - उस मामले में, आप उस पर निर्भर नहीं हो सकते हैं और आपको स्वयं को फ़ंक्शन की आपूर्ति करने की आवश्यकता है; कार्यान्वयन लिंक http://exslt.org/str/functions/tokenize/str.tokenize.template.xsl – Mormegil

+0

पर उपलब्ध है यहां एक उदाहरण है: http://stackoverflow.com/questions/10750184/looping-through- एकाधिक अनुक्रम-से-स्ट्रेटोकनाइज – Vadzim

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