2008-12-10 10 views
5

मैं अपने ट्रांसफॉर्म में बाद में उपयोग के लिए गतिशील नामों के साथ गतिशील रूप से चर बनाना चाहता हूं, लेकिन ऐसा करने के लिए मुझे गतिशील रूप से एक्सएसएल उत्पन्न करने की आवश्यकता होगी और फिर इसे उसी स्क्रिप्ट में चलाएं।उसी स्क्रिप्ट के भीतर निष्पादित गतिशील एक्सएसएल उत्पन्न करने के लिए एक्सएसएल का उपयोग करें?

यह सिर्फ एक मोटा छद्म कोड उदाहरण है जिसे मैं ढूंढ रहा हूं।

 <xsl:for-each select="//constants/constant" > 
     <xsl:variable > 
      <xsl:attribute name="name"> 
       <xsl:value-of select="@name"/> 
      </xsl:attribute> 
      <xsl:attribute name="select"> 
      <xsl:value-of select="@value"/> 
      </xsl:attribute> 
     </xsl:variable> 
     </xsl:for-each> 

मैं XSL का उपयोग कर सकते गतिशील XSL निर्माण करने के लिए एक ही स्क्रिप्ट में बाद में चलाने के लिए?

नोट: हमारा एक्सएमएल एक सीएल एक्सएसएल ट्रांसफॉर्म इंजन चलाने वाली बैच प्रक्रिया के माध्यम से परिवर्तित हो गया है; तो बस एक्सएसएल दस्तावेज़ में एक एक्सएसएल स्टाइलशीट का संदर्भ देना एक विकल्प नहीं है।

उत्तर

1

जो आप चाहते हैं वह वर्तमान में शुद्ध एक्सएसएलटी (1.0 या 2.0) में संभव नहीं है।

यदि आप Saxon 9.x XSLT processor का उपयोग कर रहे हैं, तो इसमें कुछ एक्सटेंशन फ़ंक्शन हैं जो इसे कार्यान्वित करते हैं: saxon:compile-stylesheet() और saxon:transform()

यह बहुत दुर्लभ है कि किसी समस्या का समाधान वास्तव में ऐसी कार्यक्षमता की आवश्यकता है और यह संभव है कि यदि आप समस्या का वर्णन करते हैं तो लोगों को गतिशील रूप से XSLT स्टाइलशीट को उत्पन्न और निष्पादित किए बिना इसे हल करने का सबसे अच्छा तरीका मिल जाएगा।

14

एक्सएसएलटी में एक विशेष अंतर्निर्मित सुविधा है जो उत्पादन उत्पन्न करने का समर्थन करती है, जो XSLT स्वयं है।

यह <xsl:namespace-alias> एक्सएसएलटी निर्देश है।

the XSLT 1.0 Spec द्वारा explaiened के रूप में:।

"

 
<!-- Category: top-level-element --> 
<xsl:namespace-alias 
    stylesheet-prefix = prefix | "#default" 
    result-prefix = prefix | "#default" /> 

एक स्टाइलशीट घोषित करने के लिए है कि एक नाम स्थान यूआरआई एक और नाम स्थान यूआरआई के लिए एक उर्फ ​​ है xsl:namespace-alias तत्व उपयोग कर सकते हैं एक शाब्दिक नाम स्थान यूआरआई। को अन्य नामस्थान यूआरआई के लिए उपनाम घोषित किया गया है, तो परिणाम पेड़ में नामस्थान यूआरआई नामस्थान यूआरआई होगा कि शाब्दिक नामस्थान यूआरआई के बजाय शाब्दिक नामस्थान यूआरआई एक उपनाम है। xsl:namespace-alias तत्व घोषित रेस करें कि stylesheet-prefix विशेषता द्वारा निर्दिष्ट उपसर्ग के लिए नामस्थान यूआरआई result-prefix विशेषता द्वारा निर्दिष्ट उपसर्ग के लिए नामस्थान यूआरआई के लिए उपनाम है। इस प्रकार, stylesheet-prefix विशेषता नामस्थान यूआरआई निर्दिष्ट करती है जो स्टाइलशीट में दिखाई देगी, और result-prefix विशेषता संबंधित नामस्थान यूआरआई निर्दिष्ट करती है जो परिणाम पेड़ में दिखाई देगी। "

यहाँ एक परिवर्तन है कि एक xsl:stylesheet युक्त उत्पन्न करता है की एक छोटा सा उदाहरण है एक xsl:variable, जो वांछित तरह से निर्माण किया है:

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

<xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/> 

<xsl:template match="/*"> 
    <xxx:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xxx:variable name="{@name}"> 
    <xsl:value-of select="."/> 
    </xxx:variable> 
</xxx:stylesheet> 
</xsl:template> 
</xsl:stylesheet> 

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

        <v name="myVarName">myValue</v>

वांछित परिणाम का उत्पादन किया है:

 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="myVarName">myValue</xsl:variable> 
</xsl:stylesheet> 

तो अगला कदम है "स्क्रिप्ट" इस गतिशील रूप से उत्पन्न XSLT परिवर्तन में लांच करने के लिए किया जाएगा।

+0

बस अपना उदाहरण चलाना आपके उत्तर के लिए अलग-अलग परिणाम उत्पन्न करता है। वास्तव में क्या आता है: 'xxx: स्टाइलशीट xmlns: xxx =" http://www.w3.org/1999/XSL/Transform "संस्करण =" 1.0 "> myValue ' –

+0

@blast_hardcheese, नामस्थान उपसर्ग 'xsl: namespace-alias' घोषणा' के 'परिणाम-उपसर्ग' विशेषता में निर्दिष्ट एक जैसा ही गारंटी नहीं है - यह केवल ** नेमस्पेस ** निर्दिष्ट करने के लिए प्रयोग किया जाता है कि शाब्दिक परिणाम तत्वों को आउटपुट में रखा जाना चाहिए। इस प्रकार, वास्तव में उपयोग करने के लिए कौन सा उपसर्ग एक्सएसएलटी-प्रोसेसर निर्भर है। सैक्सन वही उपसर्ग का उपयोग 'परिणाम-उपसर्ग' विशेषता में निर्दिष्ट एक के रूप में करता है। हालांकि, अन्य एक्सएसएलटी प्रोसेसर का उपयोग करने के लिए स्वतंत्रता है जो उनके डेवलपर्स ने तय किया था। –

+0

@blast_hardcheese, आपको शायद पता है कि अगर दो एक्सएमएल फाइलों में केवल कुछ उपसर्ग (नामस्थान यूआरआई नहीं हैं) वे अलग हैं, तो ये दो एक्सएमएल फाइलें बराबर हैं। –

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