2010-05-26 30 views
14

मुझे ऐसे कई उदाहरण मिले हैं जो जावा और सी को संदर्भित करते हैं, लेकिन मैं एक्सएसएल के साथ बाहरी फाइल के अस्तित्व की जांच कैसे कर सकता हूं या कर सकता हूं।मैं एक्सएसएल के साथ बाहरी फाइल के अस्तित्व की जांच कैसे करूं?

सबसे पहले, मुझे एहसास है कि यह केवल एक स्निपेट है, लेकिन यह एक विशाल स्टाइलशीट का हिस्सा है, इसलिए मुझे उम्मीद है कि यह मेरी समस्या दिखाने के लिए पर्याप्त है।

<!-- Use this template for Received SMSs --> 
<xsl:template name="ReceivedSMS"> 
    <!-- Set/Declare "SMSname" variable (local, evaluates per instance) --> 
    <xsl:variable name="SMSname"> 
     <xsl:value-of select=" following-sibling::Name"/> 
    </xsl:variable> 
    <fo:table font-family="Arial Unicode MS" font-size="8pt" text-align="start"> 
     <fo:table-column column-width=".75in"/> 
     <fo:table-column column-width="6.75in"/> 
     <fo:table-body> 
      <fo:table-row> 
       <!-- Cell contains "speakers" icon --> 
       <fo:table-cell display-align="after"> 
        <fo:block text-align="start"> 
         <fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/> 

मैं क्या करना चाहते हैं क्या, एक "अगर" बयान में डाल दिया जाता है, {$SMSname}.jpg लाइन surronding। यह है:

     <fo:block text-align="start"> 
         <xsl:if test="exists(the external file {$SMSname}.jpg)"> 
          <fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>        
         </xsl:if> 
         <xsl:if test="not(exists(the external file {$SMSname}.jpg))"> 
          <fo:external-graphic src="../images/unknown.jpg" content-height="0.6in"/>        
         </xsl:if> 
        </fo:block>      

"समूह" के कारण, मैं एक्सएसएलटी 2.0 का उपयोग कर रहा हूं। मुझे आशा है कि यह ऐसा कुछ है जो किया जा सकता है। मुझे उम्मीद है कि यह कुछ आसान है।

हमेशा की तरह, किसी भी मदद के लिए अग्रिम धन्यवाद। LO

+0

अच्छा प्रश्न (+1)। संक्षिप्त उत्तर: वर्तमान में शुद्ध एक्सएसएलटी 2.0 के साथ नहीं किया जा सकता है। लंबा जवाब और स्पष्टीकरण: मेरा जवाब देखें। :) –

+0

ऐसा लगता है कि यह EXPath एक्सटेंशन - फ़ाइल पैकेज (http://expath.org/spec/file) के साथ संभव होगा ... – potame

उत्तर

9

नहीं, यह एक्सएसएलटी 2.0/XPath 2.0 का उपयोग करके नहीं किया जा सकता है।

XSLT 2.0 समारोह unparsed-text-available() पाठ फ़ाइलों का पता लगाने और लिए ही उपयुक्त है, भले ही निर्दिष्ट यूआरआई मौजूद है इस समारोह, झूठी() वापस आ सकते हैं, क्योंकि यह भी फ़ाइल और चेक की सामग्री को पढ़ने होंगे, उनसे एक पाठ फ़ाइल कि इसमें केवल अनुमति वर्ण हैं।

spec से:

"अन-पार्स-पाठ उपलब्ध समारोह निर्धारित करता है समान तर्क के साथ अन-पार्स-पाठ समारोह पर एक कॉल एक स्ट्रिंग वापसी होगी कि क्या

तो पहला तर्क। एक खाली अनुक्रम है, फ़ंक्शन झूठा लौटाता है। यदि दूसरा तर्क खाली अनुक्रम है, तो फ़ंक्शन व्यवहार करता है जैसे कि दूसरा तर्क छोड़ा गया था।

अन्य मामलों में, फ़ंक्शन फिर से यदि सही तर्कों के साथ अनपर्स्ड-टेक्स्ट पर एक कॉल सफल हो जाता है, तो गलत हो जाता है, और गलत अगर एक ही तर्क के साथ अनपर्डेड-टेक्स्ट पर कॉल गैर-पुनर्प्राप्तिशील गतिशील त्रुटि के साथ विफल हो जाता है।

नोट:

यह जरूरी है कि अन-पार्स-पाठ उपलब्ध समारोह वास्तव में संसाधन यूआरआई से पहचान पढ़ने के लिए प्रयास करना चाहिए, और जांचें कि यह सही एन्कोड किया गया है और कोई अक्षर हैं जो एक्सएमएल में अमान्य हैं शामिल है "

उद्धरण का अंत।

2

संपादित करें: unparsed-text-available function का उपयोग करें। यह xslt 2.0 का हिस्सा है, लेकिन XQuery या स्टैंडअलोन XPath नहीं है।

मैं अपने पिछले जवाब छोड़ दिया है यहाँ तो आप अनिश्चितता के निशान का पालन कर सकते हैं ...

मैं नहीं मानता कि वहाँ मानक कार्यों का उपयोग कर XSLT में ऐसा करने का एक तरीका है। आप जावा के लिए here वर्णित विस्तार कार्यों का उपयोग करके ऐसा कर सकते हैं।

unparsed-text-available फ़ंक्शन है, लेकिन मुझे यकीन है कि यह एक मानक फ़ंक्शन है। Zvon पर इसके उपयोग का एक उदाहरण है। Unparsed-text-available का उल्लेख x12lt 2.0 का हिस्सा होने के रूप में here का उल्लेख किया गया है, और सैक्सन में समर्थित है।

+0

स्पष्टीकरण के लिए मेरा उत्तर देखें कि यह क्यों नहीं किया जा सकता है। –

2

एक प्रस्तावित File Module EXPath specification (कल्पना में file:exists()) इस जैसे फ़ाइल-प्रणाली कार्यों का समर्थन करेगा मानक XPath विस्तार कार्यों के रूप में। वहाँ अभी तक एक XS नहीं है इसके लिए एलटी कार्यान्वयन, लेकिन इसके लायक देखने लायक है।

0

यह मानक एक्सएसएलटी द्वारा पूरी तरह से नहीं किया जा सकता है, आपको एक विस्तार समारोह या कुछ कष्टप्रद कामकाज का उपयोग करना होगा। विस्तार कार्यों का उपयोग करके दो विधियां हैं: कस्टम कार्यों के लिए मानक जावा/.NET का उपयोग (सैक्सन, अल्टोवाएक्सएमएल और अन्य के कुछ संस्करणों के साथ काम करता है), या प्रोक्सर विशिष्ट एक्सटेंशन फ़ंक्शंस का उपयोग, जैसे सैक्सन: फ़ाइल-अंतिम-संशोधित()/saxon:last-modified()। आप कुछ नमूना कोड here पा सकते हैं, इंटर्न देखें: फ़ाइल-मौजूद है()।

यदि आप एक्सटेंशन फ़ंक्शंस का उपयोग नहीं कर सकते हैं, तो आप या तो एक XML फ़ाइल externaly उत्पन्न कर सकते हैं जिसमें आपके फ़ाइल सिस्टम के बारे में जानकारी होती है और इसे अपने स्टाइलशीट में पास कर दिया जाता है, या आप एसवीजी के भीतर बाइनरी छवियों को लपेट सकते हैं और fn: doc- उपलब्ध()।

10

किसी और को जो इस पुराने सवाल पर आते हैं हो सकता है, एक साथ इंटरनेट पर विभिन्न स्रोतों से जानकारी piecing द्वारा के लिए, मैं जाँच है कि क्या एक फ़ाइल मौजूद है के लिए एक जावा एक्सटेंशन का उपयोग करता है कि इस XSLT2 समारोह के साथ आया था:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:java="http://www.java.com/" 
    exclude-result-prefixes="java xs"> 

    <xsl:function name="java:file-exists" xmlns:file="java.io.File" as="xs:boolean"> 
    <xsl:param name="file" as="xs:string"/> 
    <xsl:param name="base-uri" as="xs:string"/> 

    <xsl:variable name="absolute-uri" select="resolve-uri($file, $base-uri)" as="xs:anyURI"/> 
    <xsl:sequence select="file:exists(file:new($absolute-uri))"/> 
    </xsl:function> 

</xsl:stylesheet> 

फिर आप इस तरह फ़ंक्शन का उपयोग कर सकते हैं:

<xsl:if test="java:file-exists($filename, base-uri())"> 
    <!-- ... --> 
</xsl:if> 

यह काम करता है कम से कम सैक्सन 9.1.0.5J — साथ किसी अन्य XSLT प्रोसेसर के साथ यह परीक्षण नहीं किया।

नोट: जिसका अस्तित्व आप जाँच कर रहे हैं के लिए फ़ाइल एक XML फ़ाइल है और आप XSLT2 का उपयोग कर रहे हैं, तो आप भी उपयोग कर सकते हैं में निर्मित doc-available() समारोह:

<xsl:if test="doc-available('hello_world.xml')"> 
    <!-- ... --> 
</xsl:if> 
+0

पीई 9.4 के साथ, मुझे त्रुटि संदेश मिलता है 'एक्सएसएल में त्रुटि: लाइन 32 कॉलम 66 पर अनुक्रमित-opf.xslt: XPST0017 XPath सिंटैक्स त्रुटि char 12 पर लाइन 12 पर {... xists (file: new ($ absolute-ur ...}: {java.io.File} नया नामक मिलान करने वाला 1-तर्क फ़ंक्शन नहीं ढूंढ सकता है। जावा विधियों पर कॉल पर निदान के लिए, -TJ कमांड लाइन विकल्प का उपयोग करें या कॉन्फ़िगरेशन सेट करें संपत्ति फ़ीचरकेस। टीआरएसीE_EXTERNAL_FUNCTIONS' –

+0

@torazaburo: क्या आप वाकई 'java: file-exist()' के दूसरे तर्क के रूप में 'बेस-यूरी() 'को पारित कर रहे हैं? जैसा कि:' '। साथ ही, ध्यान दें कि यह फ़ंक्शन केवल XSLT2.0 पर काम करेगा। –

0

आप की जरूरत है

<!DOCTYPE foo [ <!ENTITY bar SYSTEM "baz.xml"> ]> 

फिर स्टाइलशीट करने के लिए इकाई जोड़ें::

एक XML फ़ाइल के होने की जाँच करने के लिए, बाहरी संस्था और एक इनलाइन doctype का उपयोग करें
&bar; 

प्रोसेसर टाइमआउट नहीं होगा अगर फ़ाइल नहीं मिली है।

<xsl:variable name="page_name"> 
<xsl:choose> 
    <xsl:when test="$page = 1"> 
    <xsl:value-of select="'page1.xml'"/> 
    </xsl:when> 
    <xsl:when test="$page = 2"> 
    <xsl:value-of select="'page2.xml'"/> 
    </xsl:when> 
    <!--...--> 
    <xsl:when test="$page = 9"> 
    <xsl:value-of select="'page9.xml'"/> 
    </xsl:when> 
    <xsl:when test="$page = 10"> 
    <xsl:value-of select="'page10.xml'"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="'page0.xml'"/> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:variable> 

<xsl:variable name="agree" select="document(concat('include/pages/',$page_name))//processing-instruction()"/> 

संदर्भ

:

क्या आप जानते फ़ाइलें मौजूद हैं, लेकिन गतिशील कई में से एक लोड करने के लिए चाहते हैं, concat समारोह और एक choose/when ब्लॉक का उपयोग

1

किसी और को इसकी आवश्यकता है और इसका उपयोग कर रहा है एफओपी, मैं this answer साझा करना चाहता हूं क्योंकि यह मेरे लिए एक आकर्षण की तरह काम करता है।

मैं एक समाधान मिल गया है:

<xsl:when test="fs:exists(fs:new('myfile.html'))" xmlns:fs="java.io.File"> 
    <!-- do something here... --> 
</xsl:when> 

और यह pgfearo की जानकारी में XSLT 1.0 या 2.0

0

वापस की स्वतंत्र रूप से काम करता है।

एक प्रस्तावित फ़ाइल मॉड्यूल EXPath विनिर्देश इस जैसे फ़ाइल-प्रणाली कार्यों का समर्थन करेगा (फ़ाइल:() मौजूद है कल्पना में) मानक XPath विस्तार कार्यों के रूप में। इसके लिए अभी तक एक एक्सएसएलटी कार्यान्वयन नहीं है, लेकिन इसके लायक देखने के लायक हैं।

उन लोगों के लिए जिन्हें जांचने की आवश्यकता है कि कोई फ़ाइल मौजूद है या नहीं।

file:exists($path as xs:string) 

अभी ठीक काम करता है।