2013-01-16 7 views
28

मुझे पता है कि निम्नलिखित प्रश्न शुरुआती शुरुआती हैं लेकिन मुझे बुनियादी अवधारणा को समझने में आपकी मदद की ज़रूरत है।एक्सएसएलटी xsl: अनुक्रम। ये किस काम के लिए अच्छा है..?

मैं पहले कहना चाहूंगा कि मैं 3 साल तक एक्सएसएलटी प्रोग्रामर हूं और फिर भी कुछ नई और काफी मूल बातें हैं जो मैं यहां सीख रहा हूं, मुझे कभी नहीं पता था (मेरे काम में कोई भी अकेले प्रोग्राम कैसे सीखता है, इसमें कोई कोर्स शामिल नहीं है)।

मेरा प्रश्न है: xsl:sequence का उपयोग क्या है?

मैं सामान्य पाठ के लिए चुने गए संशोधित नोड्स और value-of के लिए नोड की प्रतिलिपि बनाने के लिए xsl:copy-of का उपयोग कर रहा हूं, ।

मुझे xsl:sequence का उपयोग करने की आवश्यकता कभी नहीं थी। मैं सराहना करता हूं अगर कोई मुझे xsl:sequence उपयोग का उदाहरण दिखा सकता है जिसे उपरोक्त नोट किए बिना पसंद किया जा सकता है या हासिल नहीं किया जा सकता है।

एक और बात, मैंने xsl:sequence पाठ्यक्रम की परिभाषा के बारे में पढ़ा है, लेकिन मैं यह नहीं समझ सकता कि यह कैसे उपयोगी है।

उत्तर

6

खैर एक खास प्रकार आप अपने नाम के बावजूद xsl:sequencexsl:value-of के रूप में उपयोग का मान प्रदान करने के लिए हमेशा एक पाठ नोड बनाता है (XSLT 1.0 के बाद से)। तो एक समारोह शरीर में आप

<xsl:sequence select="42"/> 

का उपयोग एक xs:integer मान देने के लिए, आप

<xsl:sequence select="'foo'"/> 

का उपयोग एक xs:string मूल्य और

<xsl:sequence select="xs:date('2013-01-16')"/> 

लौटने के लिए होगा एक xs:date मान देने के लिए और शीघ्र। बेशक आप अनुक्रमों को उदा। <xsl:sequence select="1, 2, 3"/>

आप इन मामलों में एक पाठ नोड या यहां तक ​​कि एक तत्व नोड बनाना नहीं चाहते हैं क्योंकि यह अक्षम है क्योंकि यह अक्षम है।

तो यह मेरा लेना है, एक्सएसएलटी और एक्सपीएथ 2.0 की नई स्कीमा आधारित प्रकार प्रणाली के साथ इन प्रकारों के मूल्यों को वापस करने या पास करने के लिए एक तरीका की आवश्यकता है और एक नए निर्माण की आवश्यकता है।

[संपादित करें] माइकल Kay अपने 'XSLT 2.0 और XPath 2.0 प्रोग्रामर के संदर्भ "के बारे में xsl:sequence में कहते हैं:" यह मासूम अनुदेश XSLT 2.0 में प्रस्तुत दूर XSLT भाषा की क्षमता पर प्रभाव तक पहुँचने है, क्योंकि इसका मतलब है कि XSLT निर्देश और अनुक्रम कन्स्ट्रक्टर (और इसलिए फ़ंक्शंस और टेम्पलेट्स) XPath डेटा मॉडल द्वारा अनुमत किसी भी मान को वापस करने में सक्षम हो जाते हैं। इसके बिना, एक्सएसएलटी निर्देशों का उपयोग केवल परिणाम पेड़ में नए नोड्स बनाने के लिए किया जा सकता है, लेकिन इसके साथ, वे भी वापस आ सकते हैं परमाणु मूल्य और मौजूदा नोड्स के संदर्भ। "।

38

<xsl:sequence> परमाणु मूल्य (या परमाणु मूल्यों का अनुक्रम) पर <xsl:copy-of> दोनों ही उनके इनपुट की एक प्रति वापस लौटते हैं। अंतर तब आता है जब आप नोड्स पर विचार करते हैं।

रूप

<xsl:variable name="n" select="/html"/> 

की तरह कुछ से परिभाषित किया गया है, तो $ n एक भी तत्व नोड, जैसे है तो

<xsl:copy-of select="$n"/> 

नोड के प्रतिलिपि रिटर्न, यह एक ही नाम और बच्चा है संरचना लेकिन यह एक नई पहचान (और कोई अभिभावक) के साथ नया नोड है।

<xsl:sequence select="$n"/> 

रिटर्न नोड $ एन, नोड लौटे $ n के रूप में एक ही मूल है और is Xpath ऑपरेटर द्वारा इसे करने के लिए बराबर है।

अंतर लगभग पूरी तरह से पारंपरिक (XSLT 1 शैली) टेम्पलेट के उपयोग में छिपा होता है के रूप में आप कभी नहीं या तो आपरेशन निर्माता का परिणाम परोक्ष तथ्य तो उत्पादन पेड़ को कॉपी किया है का परिणाम तक पहुँच प्राप्त है कि नहीं करता है xsl:sequence एक प्रतिलिपि बनाने के लिए मुखौटा नहीं है।

<xsl:template match="a"> 
    <x> 
    <xsl:sequence select="$n"/> 
    </x> 
</xsl:template> 

रूप

<xsl:template match="a"> 
    <x> 
    <xsl:copy-of select="$n"/> 
    </x> 
</xsl:template> 

ही दोनों एक नए तत्व नोड बनाने के लिए और कॉपी नए नोड x के बच्चों के रूप में सामग्री का परिणाम है।

हालांकि यदि आप फ़ंक्शंस का उपयोग करते हैं तो अंतर तुरंत देखा जाता है।

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="data:,f"> 

    <xsl:variable name="s"> 
     <x>hello</x> 
    </xsl:variable> 

    <xsl:template name="main"> 
     :: 
     :: <xsl:value-of select="$s/x is f:s($s/x)"/> 
     :: <xsl:value-of select="$s/x is f:c($s/x)"/> 
     :: 
     :: <xsl:value-of select="count(f:s($s/x)/..)"/> 
     :: <xsl:value-of select="count(f:c($s/x)/..)"/> 
     :: 
    </xsl:template> 

    <xsl:function name="f:s"> 
     <xsl:param name="x"/> 
     <xsl:sequence select="$x"/> 
    </xsl:function> 

    <xsl:function name="f:c"> 
     <xsl:param name="x"/> 
     <xsl:copy-of select="$x"/> 
    </xsl:function> 

</xsl:stylesheet> 

उत्पादन

$ saxon9 -it main seq.xsl 
<?xml version="1.0" encoding="UTF-8"?> 
:: 
:: true 
:: false 
:: 
:: 1 
:: 0 
:: 

यहाँ xsl:sequence और xsl:copy-of के परिणाम बिल्कुल भिन्न हैं।

21

xsl के लिए सबसे आम उपयोग केस: अनुक्रम xsl: function से परिणाम वापस करना है।

<xsl:function name="f:get-customers"> 
    <xsl:sequence select="$input-doc//customer"/> 
</xsl:function> 

लेकिन यह भी अन्य संदर्भों में काम किया जा सकता है, उदाहरण के

<xsl:variable name="x" as="element()*"> 
    <xsl:choose> 
    <xsl:when test="$something"> 
     <xsl:sequence select="//customer"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:sequence select="//supplier"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

यहाँ मुख्य बात यह है कि यह रिटर्न मूल नोड्स के लिए संदर्भ, यह नई प्रतियां बनाने के लिए नहीं करता है।

+0

दूसरे उदाहरण में, इसका मतलब है xsl: अनुक्रम प्रदर्शन के लिए बेहतर है? फिर, xsl पर अनुक्रम का लाभ क्या है: अनुक्रम? – user3813234

+3

मुझे संदेह है कि बहुत कम मामले हैं जहां आपको वास्तव में xsl की आवश्यकता है: प्रतिलिपि। जब तक आप सत्यापन = सख्त या प्रति-नामस्थान = नहीं, शायद उपयोग करते हैं। अधिकांश मामलों में xsl का उपयोग करते हुए: xsl की बजाय प्रतिलिपि: अनुक्रम हानिरहित होगा लेकिन निश्चित रूप से कुछ ऐसे मामले हैं जहां यह अनावश्यक और महंगी प्रतिलिपि का कारण बन सकता है जब तक कि अनुकूलक इसे रोकने के लिए पर्याप्त स्मार्ट न हो। लेकिन उपर्युक्त उदाहरण में, दोनों बराबर नहीं हैं: $ x/.. यदि आप प्रतियां बनाते हैं तो कुछ भी नहीं लौटाता है, लेकिन मूल नोड्स के माता-पिता को वापस लौटाता है यदि आप उन्हें xsl: अनुक्रम के साथ चुनते हैं। –

+0

आह मैं देखता हूं। आपका बहुत बहुत धन्यवाद! – user3813234

0

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

<a> 
    <b>node b</b> 
    <c>node c</c> 
</a> 

कहीं अपने XSLT में:

<xsl:variable name="foo"> 
    <xsl:if select="b"><d>Got a "b" node</d></xsl:if> 
    <xsl:if select="c"><d>Got a "c" node</d></xsl:if> 
</xsl:variable> 
<xsl:if test="$foo/node()"> 
    <wrapper><xsl:sequence select="$foo"/></wrapper> 
</xsl:if> 

आप डेमो यहाँ देख सकते हैं:

: http://xsltransform.net/eiZQaFz

यह तरीका इस तरह प्रत्येक टैग परीक्षण से बेहतर है

<xsl:if test="a|b">...</xsl:if> 

क्योंकि आप इसे दो स्थानों पर संपादित करना समाप्त कर देंगे।इसके अलावा प्रसंस्करण की गति इस बात पर निर्भर करेगी कि आपके आवेग में कौन से टैग हैं। यदि यह आपके परीक्षण से आखिरी है, तो इंजन पहले सभी की उपस्थिति का परीक्षण करेगा। चूंकि $ foo/node() एक मुहावरे है "क्या कोई बच्चा तत्व है?", इंजन इसे अनुकूलित कर सकता है। ऐसा करने से, आप सभी के जीवन को कम करते हैं।

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