2012-01-24 10 views
6

मैं XSLT में एक सशर्त शामिल करना चाहता हूं, लेकिन xsl: शामिल एक शीर्ष स्तर तत्व है। आप केवल xsl का उपयोग कर सकते हैं: if या xsl: टेम्पलेट के अंदर चुनें। क्या कोई हैक या काम है जिसके आसपास एक बाहरी फाइल के सशर्त शामिल हैं? मैंने दस्तावेज़() फ़ंक्शन का उपयोग करने का प्रयास किया, लेकिन यह मेरी बाहरी फ़ाइल को लोड करने में विफल रहता है (संभवतः क्योंकि यह नियमों के कुछ सेट के अनुरूप नहीं है जो इसे "वैध" बना देगा)।एक्सएसएलटी सशर्त बाहरी फाइल

मेरी बाहरी xml फ़ाइल xslt कोड खंडों का एक गुच्छा है। मुख्य XSLT फ़ाइल में एक चर के मान के आधार पर, बाहरी फ़ाइल से corisponding कोड जगह में "कॉपी/पेस्ट" होना चाहिए (जैसे सशर्त सी या PHP में शामिल)।

अपने मुख्य XSLT फ़ाइल के प्रवाह को निम्नलिखित तरीके से आगे बढ़ना चाहिए:

$configurationMode 
if ($configurationMode = Standard) { xsl:include="standard.xml" } else { xsl:include="alt.xml" } 

जाहिर है मैं इसे ऊपर के रूप में के रूप में बस ऐसा नहीं कर सकते, इसलिए कारण है कि मैं अगर वहाँ एक हैक या समाधान नहीं है पूछ रहा हूँ।

उत्तर

3

जैसा कि मैं चीजों को समझता हूं, 'शामिल' होता है जब एक्सएमएल पार्सर स्टाइल शीट को पार्सिंग और संकलित कर रहा है। इसका मतलब है कि शामिल होने से पहले कोई तर्क या अभिव्यक्ति मूल्यांकन नहीं हो सकता है और इसलिए इसे सशर्त बनाने का कोई तरीका नहीं है। स्टाइल शीट के बाहर आपको सशर्त व्यवहार करने की आवश्यकता है।

यह कई बार उठाया गया:

इस http://www.dpawson.co.uk/xsl/sect2/N4760.html#d6065e100

विशेष रूप से पर एक नज़र माइक Kay मदद इस टिप्पणी करता है। पिछले धागे पर हम निष्कर्ष निकालने के लिए आए थे कि उपयोगकर्ता सामान्य उद्देश्य स्टाइलशीट जी लिखने की कोशिश कर रहा था और उसके बाद विशेष उद्देश्य स्टाइलशीट ए या बी सहित सशर्त रूप से इसका विशेषज्ञ बन गया। इस आवश्यकता को पूरा करने का तरीका है ए और बी में जी शामिल है, दूसरी तरफ नहीं, और फिर परिवर्तन शुरू करते समय सशर्त रूप से ए या बी को मूल स्टाइलशीट के रूप में चुनें।

6

यह XSLT 1.0 के साथ नहीं किया जा सकता है और (एक बहुत ही सीमित हद तक) use-when विशेषता उपयोग किया जा सकता XSLT 2.0 में।

xsl:include या xsl:import निर्देश की वांछित गतिशील परिवर्तन को प्राप्त करने के गैर-xslt तरीके मौजूद हैं। इस तरह के

एक विधि एक XmlDocument के रूप में XSLT स्टाइलशीट लोड करने के लिए, और करने के लिए उपयोग और विशेषताओं के संशोधन के लिए उपलब्ध डोम तरीकों का उपयोग कर, इच्छित मान को href विशेषता निर्धारित करने में है। फिर इस मेमोरी-संशोधित XMLDocument- निहित XSLT स्टाइलशीट से परिवर्तन आरंभ करें।

3

संरचना को बदलने का प्रयास करें: यदि आपके पास दो विशेष उद्देश्य मॉड्यूल pink.xsl और blue.xsl हैं, और एक सामान्य उद्देश्य मॉड्यूल baby.xsl है, तो गुलाबी.एक्सएसएल या नीले रंग में से किसी एक को आयात/शामिल करने की बजाय। xsl baby.xsl में, इसके बजाय pink.xsl या blue.xsl का उपयोग शीर्ष-स्तरीय एंट्री स्टाइलशीट के रूप में करें, और इन दोनों में से प्रत्येक आयात baby.xsl है। इस तरह से इसे इस्तेमाल करने के लिए डिज़ाइन किया गया था, यह हैक या वर्कअराउंड के लिए है।

वैकल्पिक रूप से, आपके परिदृश्य की इस विवरण को देखते हुए अपने मामले में एक बेहतर दृष्टिकोण, एक अलग कदम के रूप में इन टुकड़ों से स्टाइलशीट इकट्ठा करने के लिए हो सकता है एक XSLT tranformation का उपयोग कर "मेरे बाहरी xml फ़ाइल xslt कोड के टुकड़े का एक समूह है" xsl का उपयोग करने के बजाय: शामिल/xsl: आयात करें।

0

जो पहले से ही कहा गया है, इसके अलावा, एक संभावित समाधान पूरक फाइलों को सादा, सामग्री प्रदान करने वाली एक्सएमएल फाइलें (एक्सएसएलटी फाइलों के बजाय) बनाना होगा। इस तरह, आप उन्हें XPath के document() फ़ंक्शन के साथ शामिल कर सकते हैं (जिसे संकलन-समय के बजाए रन-टाइम पर मूल्यांकन किया जाएगा)।

फिर आप लोड किए गए XML दस्तावेज़ की सामग्री के आधार पर अपने परिवर्तन के व्यवहार को बदल सकते हैं; हालांकि, आप शामिल दस्तावेज़ों में निष्पादन योग्य एक्सएसएलटी टुकड़े प्रदान नहीं कर सकते हैं।

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

जब आपको document() के साथ समस्या हो रही है, तो अपनी फ़ाइलों पर एक XML सत्यापनकर्ता का उपयोग करें। एक त्रुटि का तात्पर्य है कि आपकी फ़ाइलें मान्य XML नहीं हैं।

0
<xsl:variable name="CONDITIONAL" select="ELEMENT/CONDITION"/> 
<xsl:variable name="DOCUMENTNAME" select="document(concat($CONDITIONAL,'-DOCUMENT.xml'))/ELEMENT"/> 

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

तो जब मैं बाहरी XML फ़ाइल से जानकारी चाहता हूं तो मैं बाहरी डेटा को संदर्भित करने के लिए '$ DOCUMENTNAME' का उपयोग करता हूं।

1

सुनिश्चित नहीं है कि यह आपके परिदृश्य पर लागू होगा, लेकिन मैं इसे वैसे भी बाहर फेंकने जा रहा हूं।

मैंने अतीत में समान चीजें की हैं, लेकिन एक सशर्त बनाने के बजाय, मैं xsl के आधार पर दो फ़ाइलों में से किसी एक में टेम्पलेट को कॉल करता हूं: जब मूल्यांकन होता है। यदि आप अपने मामले में टेम्पलेट्स का उपयोग नहीं करना चाहते हैं, तो इस उत्तर की उपेक्षा करें।

उदाहरण के लिए, कहते हैं कि "जनक" xslt फ़ाइल root.xslt कहा जाता है, और दो सशर्त-प्रयोग से काफी child1.xslt और child2.xslt हैं। मान लें कि मैं स्थिति नामक नोड के मूल्य के खिलाफ सशर्त तर्क चलाने के लिए चाहता हूं। यदि मान "वर्तमान" है, तो मैं नामक एक टेम्पलेट को कॉल करना चाहता हूं, बच्चे 1.xslt में वर्तमान है, अन्यथा नामक टेम्पलेट को कॉल करें, नॉटक्यूरेंट child2.xslt में। अल्पसंख्यक के लिए, प्रत्येक मामले में मैं बस रूट नोड और सभी बच्चों को टेम्पलेट पास कर रहा हूं।

यह कुछ इस तरह दिखाई चाहते हैं:

<?xml version="1.0" encoding="utf-8"?> 
<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:import href="child1.xslt"/> 
    <xsl:import href="child2.xslt"/> 

    <xsl:template match="/"> 
     <xsl:choose> 
     <xsl:when test="rootNode/status = 'CURRENT'"> 
      <!-- template isCurrent defined in child1.xslt --> 
      <xsl:apply-templates select="rootNode" mode="isCurrent" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <!-- template isNotCurrent defined in child2.xslt --> 
      <xsl:apply-templates select="rootNode" mode="isNotCurrent" /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

आशा इस कम से कम एक छोटा सा मदद करता है।

0

static parameters के अतिरिक्त, यह अब एक्सएसएलटी 3.0 में संभव है।xsl:include की use-when विशेषता में स्टेटिक पैरामीटर का उपयोग किया जा सकता है।

अब हम false() के मूलभूत मूल्यों के साथ मानकों की घोषणा और उसके बाद लोगों को हम रन टाइम पर जरुरी है सकते हैं ...

<xsl:param name="someparam" as="xs:boolean" select="false()" 
    static="yes" required="no"/> 
<xsl:include href="include_me.xsl" use-when="$someparam"/> 

यहाँ एक पूर्ण काम कर उदाहरण Saxon-HE v9.7 (भी साथ परीक्षण के साथ परीक्षण किया जाता है सैक्सन-पीई 9.5)।

एक्सएमएल इनपुट (test.xml)

<doc> 
    <foo/> 
</doc> 

मुख्य XSLT 3.0 (test_main.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="inc1" as="xs:boolean" select="false()" 
    static="yes" required="no"/> 
    <xsl:param name="inc2" as="xs:boolean" select="false()" 
    static="yes" required="no"/> 

    <xsl:include href="test_inc1.xsl" use-when="$inc1"/> 
    <xsl:include href="test_inc2.xsl" use-when="$inc2"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

पहले संभव शामिल XSLT 3.0 (test_inc1.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="foo"> 
    <xsl:copy>INCLUDE FILE 1!!!</xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

दूसरा संभव शामिल XSLT 3.0 (test_inc2.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="foo"> 
    <xsl:copy>INCLUDE FILE 2!!!</xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

कमांड लाइन (सेटिंग सही पर inc2)

java -cp "saxon9he.jar" net.sf.saxon.Transform -s:"test.xml" -xsl:"test_main.xsl" inc2="true" 

आउटपुट

<doc> 
    <foo>INCLUDE FILE 2!!!</foo> 
</doc> 
0

नहीं है एक दृष्टिकोण जो मैंने सशर्त रूप से उपयोग में फ़ाइलों को शामिल किया है- जब एक्सएसएलटी 2.0 में सुविधा।

java -DDebug=yes myAppPath 

:

आप की तरह मेरे मामले में मैं जावा का उपयोग कर रहा तो मैं "डीबग" संपत्ति अपने आवेदन को चलाने के लिए आदेश का उपयोग कर बनाया है एक प्रणाली संपत्ति जो रनटाइम पर आवेदन के माध्यम से पारित हो जाता है बनाने के लिए फिर एक्सएसएलटी में सशर्त फाइलों को शामिल करने के लिए इस संपत्ति का उपयोग करें। उदाहरण के लिए

<xsl:include href="file1.xslt" use-when="system-property('DEBUG') = 'yes'"/> 
<xsl:include href="file2.xslt" use-when="system-property('DEBUG') != 'yes'"/> 

इस तरह।

पता नहीं है कि यह पूछे जाने वाले परिदृश्य के लिए फिट बैठता है लेकिन हाँ XSLT 2.0 में ऐसा करने का तरीका है। एक्सएसएलटी 3.0 में, स्थानीय चर के लिए समर्थन भी जोड़ा गया है। इसलिए स्थानीय चर का उपयोग करके इसे आसानी से किया जा सकता है।

धन्यवाद, मुबारक कोडिंग

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