2009-02-01 11 views
5

प्रश्न

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

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

दुर्भाग्यवश, इसे प्राप्त करने के लिए मुझे एकमात्र तरीका मिलना एक हैक था। यह इस तरह काम करता है,

  1. एक एक्सएमएल फ़ाइल में निर्देशिका सूची लिखने के लिए इंटरनेट के चुराए गए एक यादृच्छिक चींटी कार्य का उपयोग करें।
  2. xml फ़ाइल को xslt रूपांतरण में फ़ीड करें जो तब अन्य निर्देशिका सूची संदर्भित XML फ़ाइलों को लोड कर सकता है और उन्हें संयोजित कर सकता है।
  3. निर्देशिका सूची युक्त अस्थायी xml फ़ाइल हटाएं।

यहाँ चींटी स्क्रिप्ट

<taskdef name="xml-dir-list" 
    classname="net.matthaynes.xml.dirlist.AntFileListing" 
    classpath="antlib/xml-dir-listing.0.1.jar; 
    antlib/jakarta-regexp-1.5.jar;antlib/log4j-1.2.14.jar"/> 

<macrodef name="build-plugin-xml" description="todo"> 
    <attribute name="pluginName"/> 

    <xml-dir-list depth="0" verbose="false" 
     srcDir="${src.dir}/@{pluginName}/forms/" includesRegEx="\.xml$" 
     destFile="${src.dir}/@{pluginName}/forms/fileList.xml"/> 

    <xslt in="${src.dir}/forms/fileList.xml" 
     out="${src.dir}/@{pluginName}/@{pluginName}_extn.yuix 
     style="${src.dir}/@{pluginName}/forms/extn.yuix.xsl" /> 

    <delete file="${src.dir}/@{pluginName}/forms/fileList.xml"/> 
</macrodef> 

यहाँ

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

    <xsl:template match="/"> 
     <Forms applicationId="YFSSYS00011"> 
      <GlobalExtensions> 
       <Tasks/> 
      </GlobalExtensions> 
      <xsl:apply-templates select="directory/file"/> 
     </Forms> 
    </xsl:template> 

    <xsl:template match="file"> 
     <xsl:copy-of select="document(@name)/Forms/Form"/> 
    </xsl:template> 
</xsl:stylesheet> 

किसी को क्या XSLT में विलय करने के लिए फ़ाइलों की इस गतिशील खोज को प्राप्त करने के लिए एक सरल रास्ता मिल गया है और स्टाइलशीट है,? यह आश्चर्य की बात नहीं है कि एक्सएसएलटी निर्देशिकाओं को सीधे नहीं पढ़ सकता है, लेकिन मुझे उम्मीद है कि फाइल नामों की सूची में किसी अन्य एक्सएमएल फ़ाइल के माध्यम से पास करने का एक आसान तरीका मिल रहा है।

लागू समाधान

Dimitre's solution महान काम किया है एक बार मैं, चींटी स्क्रिप्ट में कुछ अतिरिक्त सुधार किया था

<taskdef name="saxon-xslt" classname="net.sf.saxon.ant.AntTransform" 
    classpath="antlib/saxon9.jar;antlib/saxon9-ant.jar"/> 

[...]

<macrodef name="build-plugin-xml" description="todo"> 
    <attribute name="pluginName"/> 

    <saxon-xslt 
     in="build.xml" 
     out="${compca.src.dir}/temp/@{pluginName}/@{pluginName}_extn.yuix" 
     style="antscripts/extn.yuix.xsl"> 
    <param name="formsDir" 
     expression="${compca.src.dir}/@{pluginName}/forms/"/> 
    </saxon-xslt> 
</macrodef> 

और XSL स्टाइलशीट (जो मैंने स्थानांतरित किया)

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:param name="formsDir" /> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

     <xsl:template match="/"> 
      <Forms applicationId="YFSSYS00011"> 
       <GlobalExtensions> 
        <Tasks/> 
       </GlobalExtensions> 
       <xsl:apply-templates select= 
        "collection(
        concat('file:///', 
        $formsDir, 
        '?select=*.yuix;recurse=yes;on-error=ignore' 
       ) 
       )/* 
       "/> 
      </Forms> 

     </xsl:template> 

     <xsl:template match="file"> 
      <xsl:copy-of select="/Forms/Form"/> 
     </xsl:template> 
    </xsl:stylesheet> 

वे बदलाव केवल पैरामीटर के साथ निर्देशिका को लोड करने और सेट करने के लिए सैक्सन 9 प्राप्त करने के आसपास थे।

उत्तर

6

किसी को भी पाया का एक सरल तरीका क्या फ़ाइलों XSLT में मर्ज करने के लिए की इस गतिशील खोज को प्राप्त है? यह आश्चर्य की बात नहीं है कि XSLT निर्देशिका सीधे नहीं पढ़ सकते हैं, लेकिन मैं उम्मीद कर रही थी एक और xml फ़ाइल के माध्यम से फ़ाइल नाम का एक सूची में पारित करने के लिए एक सरल तरीका खोजने के लिए।

गतिशील खोज और एक्सएमएल फाइल के प्रसंस्करण XPath 2/0/XSLT 2 का उपयोग किया जा सकता है।0। अधिक विशेष रूप से, किसी को XPath 2.0 collection() फ़ंक्शन का उपयोग करना होगा।

विवरण के लिए, my answer to this question देखें।

तो, अगर चींटी एक उपयुक्त XSLT 2.0 प्रोसेसर उपयोग कर सकते हैं,, समस्या एक पूर्ण समाधान, मानक collection() फ़ंक्शन का उपयोग किया है (मैं Saxon का उपयोग कर की सिफारिश करेंगे)।