এক্সএসডি - কোনও ক্রমে উপাদানগুলিকে কতবার অনুমতি দেওয়া যায়?


109

আমি একটি এক্সএসডি তৈরি করার চেষ্টা করছি, এবং নিম্নলিখিত প্রয়োজনের সাথে সংজ্ঞাটি লেখার চেষ্টা করছি:

  • সন্তানের উপাদানকে যেকোন সংখ্যক বার প্রদর্শিত হতে অনুমতি দিন (0 থেকে আনবাউন্ডেড)
  • শিশু উপাদানগুলিকে যেকোন ক্রমে থাকতে অনুমতি দিন

আমি কাছাকাছি তাকিয়ে মতো বিভিন্ন সমাধান পাওয়া এই :

<xs:element name="foo">
  <xsl:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="child1" type="xs:int"/>
      <xs:element name="child2" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

তবে আমি যেটি এক্সকে বুঝি তা থেকে: পছন্দ এখনও কেবলমাত্র একক উপাদান নির্বাচনের অনুমতি দেয়। অতএব, ম্যাকস্যাকার্সকে আনবাউন্ডেড এ জাতীয় সেট করার অর্থ এই হওয়া উচিত যে শিশু উপাদানগুলির "যে কোনও একটি" একাধিকবার উপস্থিত হতে পারে। এটা কি সঠিক?

যদি উপরের সমাধানটি ভুল হয় তবে আমি আমার প্রয়োজনীয়তার সাথে উপরে যা বলেছি তা কীভাবে অর্জন করতে পারি?

সম্পাদনা : প্রয়োজন অনুসারে যদি নিম্নলিখিত হয়?

  • এলিমেন্ট চাইল্ড 1 চাইল্ড 2 যে কোনও সংখ্যক বার উপস্থিত হতে পারে (0 থেকে আনবাউন্ডেড)
  • উপাদানগুলি যে কোনও ক্রমে হবে
  • এলিমেন্ট চাইল্ড 3 এবং চাইল্ড 4 একবারে উপস্থিত হওয়া উচিত।

উদাহরণস্বরূপ, এই এক্সএমএলটি বৈধ:

<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

তবে এটি নয় (শিশু 3 নিখোঁজ)

<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

উত্তর:


61

আপনার প্রশ্নে থাকা স্কিমাতে child1বা child2কোনও ক্রমে, যে কোনও সংখ্যক বারে উপস্থিত হতে পারে। সুতরাং এটি আপনি যা খুঁজছেন তা মনে হচ্ছে।

সম্পাদনা করুন: আপনি যদি কেবলমাত্র তাদের মধ্যে একটির সীমাহীন সংখ্যকবার উপস্থিত হতে চেয়েছিলেন তবে আনবাউন্ডকে তার পরিবর্তে উপাদানগুলিতে যেতে হবে:

সম্পাদনা: এক্সএমএলে স্থির ধরনের।

সম্পাদনা করুন: ম্যাকসকার্সে মূলধনযুক্ত হে O

<xs:element name="foo">
   <xs:complexType>
     <xs:choice maxOccurs="unbounded">
       <xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
       <xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
     </xs:choice>
   </xs:complexType>
</xs:element>

মূলত হ্যাঁ, আমি চাইল্ড আই 1, চাইল্ড 2 যেকোন ক্রমে হাজির হওয়ার জন্য, যে কোনও সংখ্যক বারের সন্ধান করছি .. আপনি যে উত্তরটি দিয়েছেন এখানে কেবলমাত্র একক উপাদানটির জন্য কাজ করে, তাই না? বা এটি আমার প্রয়োজনীয়তাও সমাধান করে?
jvtech

আপনার প্রশ্নের স্কিমা আপনার প্রয়োজনীয়তা পূরণ করে; আমার উত্তরের বিকল্প স্কিমাটি একটি একক উপাদানের জন্য। আশা করি এটার ওপর পরিস্কার করা হবে! :)
xcut

@ পাভেল, @ এক্সকুট, স্পষ্টকরণের জন্য ধন্যবাদ, সম্পাদিত প্রয়োজনীয়তা দেখুন .. কোন চিন্তা?
jvtech

2
jvtech: আপনি এক্সএমএল স্কিমার সাহায্যে সম্পাদিত প্রয়োজনীয়তাটি পূরণ করতে পারবেন না; এটি অর্জনের একমাত্র উপায় হ'ল চাইল্ড 3 এবং চাইল্ড 4 কেবল শেষে উপস্থিত হতে পারে। কোন ক্ষেত্রে আপনার পছন্দ এবং তারপরে দুটি উপাদান যুক্ত একটি ক্রম প্রয়োজন।
xcut

1
@ দাইজ-দাজন আমিও দেখতে পেলাম যে এটি কার্যকর হয়নি। পছন্দের উপাদানটিতে maxOccurs = "আনবাউন্ডেড" যুক্ত করার চেষ্টা করুন যাতে একাধিক সন্তানের উপাদান অনুমোদিত হয়।
মাইকড

107

পরবর্তী সম্পাদনায় যুক্ত হওয়া প্রশ্নের বিকল্প সূত্রটি এখনও উত্তরহীন বলে মনে হচ্ছে: কোনও উপাদানটির বাচ্চাদের মধ্যে কীভাবে নির্দিষ্ট করতে হবে যে কোনও একটির নাম child3, একটি নাম child4, এবং নাম্বারযুক্ত কোনও নম্বর থাকতে হবে child1বা child2যাতে আদেশে কোনও বাধা নেই যা শিশুরা উপস্থিত হয়।

এটি একটি সরলভাবে নির্ধারণযোগ্য নিয়মিত ভাষা এবং আপনার প্রয়োজনীয় সামগ্রীর মডেলটি নিয়মিতভাবে প্রকাশিত স্ট্রিংয়ের সংজ্ঞা নির্ধারণের জন্য আইসোমর্ফিক হয় যেখানে প্রতিটি '3' এবং '4' প্রতিটি অঙ্ক একবারে ঘটে থাকে এবং অঙ্কগুলি '1' এবং '2' 'যে কোনও সংখ্যক বার দেখা যায়। এটি কীভাবে লিখবেন তা যদি স্পষ্ট না হয় তবে এই জাতীয় ভাষা চিনতে আপনি কী ধরণের সসীম রাষ্ট্রের মেশিনটি তৈরি করবেন তা ভাবতে সহায়তা করতে পারে। এটির অন্তত চারটি স্বতন্ত্র রাজ্য থাকবে:

  • একটি প্রাথমিক অবস্থা যেখানে '3' বা '4' দেখা যায় নি
  • একটি মধ্যবর্তী অবস্থা যেখানে '3' দেখা গেছে তবে '4' নয়
  • একটি মধ্যবর্তী অবস্থা যেখানে '4' দেখা গেছে তবে '3' নয়
  • একটি চূড়ান্ত অবস্থা যেখানে '3' এবং '4' উভয়ই দেখা গেছে

অটোমেটন কোন অবস্থায় রয়েছে তা বিবেচনাধীন, '1' এবং '2' পড়তে পারে; তারা মেশিনের অবস্থা পরিবর্তন করে না। প্রাথমিক অবস্থায়, '3' বা '4' গ্রহণ করা হবে; মধ্যবর্তী অবস্থায়, কেবল '4' বা '3' গ্রহণ করা হয়; চূড়ান্ত অবস্থায় '3' বা '4' গ্রহণ করা হয় না। নিয়মিত প্রকাশের কাঠামোটি বোঝা সহজ হয় যদি আমরা প্রথমে আমাদের ভাষার উপসেটের জন্য একটি রেজেক্স সংজ্ঞায়িত করি যেখানে কেবল '3' এবং '4' ঘটে থাকে:

(34)|(43)

'1' বা '2' প্রদত্ত স্থানে যেকোন সংখ্যক বার সংঘটিত হওয়ার জন্য, আমরা সন্নিবেশ করতে পারি (1|2)*(বা [12]*যদি আমাদের রেজেক্স ভাষা সেই স্বীকৃতিটি স্বীকার করে)। সমস্ত উপলব্ধ অবস্থানগুলিতে এই অভিব্যক্তিটি সন্নিবেশ করানো, আমরা পাই

(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*

এটি একটি সামগ্রী মডেলে অনুবাদ করা সোজা is মূল কাঠামোটি রেজেক্সের সমতুল্য (34)|(43):

<xsd:complexType name="paul0">
  <xsd:choice>
    <xsd:sequence>
      <xsd:element ref="child3"/>
      <xsd:element ref="child4"/>
    </xsd:sequence>
    <xsd:sequence>
      <xsd:element ref="child4"/>
      <xsd:element ref="child3"/>
    </xsd:sequence>
  </xsd:choice>
</xsd:complexType>

শূন্য বা আরও বেশি পছন্দ সন্নিবেশ করা child1এবং child2সোজা:

<xsd:complexType name="paul1">
  <xsd:sequence>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="child1"/>
      <xsd:element ref="child2"/>
    </xsd:choice>      
    <xsd:choice>
      <xsd:sequence>
        <xsd:element ref="child3"/>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="child1"/>
          <xsd:element ref="child2"/>
        </xsd:choice>      
        <xsd:element ref="child4"/>
      </xsd:sequence>
      <xsd:sequence>
        <xsd:element ref="child4"/>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="child1"/>
          <xsd:element ref="child2"/>
        </xsd:choice>      
        <xsd:element ref="child3"/>
      </xsd:sequence>
    </xsd:choice>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="child1"/>
      <xsd:element ref="child2"/>
    </xsd:choice>      
  </xsd:sequence>
</xsd:complexType>

আমরা বাল্ক একটু কমান চান, আমরা এর পুনরাবৃত্তি পছন্দ জন্য একটি নামাঙ্কিত গ্রুপ বর্ণনা করতে পারেন child1এবং child2:

<xsd:group name="onetwo">
  <xsd:choice>
    <xsd:element ref="child1"/>
    <xsd:element ref="child2"/>
  </xsd:choice>   
</xsd:group>

<xsd:complexType name="paul2">
  <xsd:sequence>
    <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:choice>
      <xsd:sequence>
        <xsd:element ref="child3"/>
        <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="child4"/>
      </xsd:sequence>
      <xsd:sequence>
        <xsd:element ref="child4"/>
        <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="child3"/>
      </xsd:sequence>
    </xsd:choice>  
    <xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

allএক্সএসডি ১.১ এ, গ্রুপগুলিতে থাকা কিছু প্রতিবন্ধকতা সরিয়ে নেওয়া হয়েছে, সুতরাং এই বিষয়বস্তুর মডেলটি আরও সংক্ষিপ্তভাবে সংজ্ঞায়িত করা সম্ভব:

<xsd:complexType name="paul3">
  <xsd:all>
    <xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element ref="child3"/>
    <xsd:element ref="child4"/>      
  </xsd:all>
</xsd:complexType>

তবে পূর্বে প্রদত্ত উদাহরণ থেকে যেমন দেখা যায়, allগোষ্ঠীগুলিতে এই পরিবর্তনগুলি আসলে ভাষার ভাববাদী শক্তিকে পরিবর্তন করে না; তারা কেবল নির্দিষ্ট ধরণের ভাষার সংজ্ঞাটিকে আরও সংযুক্ত করে তোলে।


3
আমি এক্সএসডি 1.0 এক্স পছন্দ করি: সমস্ত বিকল্প।
TWiStErRob

8
+1 টি। এটি একটি দুর্দান্ত উত্তর এবং এটি আরও বেশি উপায়ে দাবিদার।
ক্রিস্টোফার লেটে

1
দুর্দান্ত উত্তর! আমি সত্যিই এই মত ব্যাখ্যা পছন্দ। এটি লক্ষ্য অর্জনের পিছনে সমস্ত যুক্তি এবং যুক্তি প্রকাশ করে। এখন আমি কেবল এই সমস্যাটি কীভাবে সমাধান করবেন তা জানি না, তবে অনুরূপ সমস্যাগুলি সমাধান করার জন্য আমি একটি নতুন পদ্ধতি শিখেছি। একটি সীমাবদ্ধ রাষ্ট্র অটোমেশন ব্যবহার করে এটি ব্যাখ্যা করা খুব ভাল ধারণা।
এজেলেভ

3
মাইকেল, আপনি বলেছেন যে "সর্বদলীয় এই পরিবর্তনগুলি আসলে ভাষার ভাববাদী শক্তিকে পরিবর্তন করে না; তারা কেবল নির্দিষ্ট ধরণের ভাষার সংজ্ঞাটিকে আরও সংহত করে"। তবে আপনি যদি সমস্যাটিকে যে কোনও সংখ্যক শিশু উপাদানগুলিতে সাধারণীকরণ করেন, যার একটি উপসেট একবার এবং অন্য উপসেটটি প্রদর্শিত হতে পারে যা বেশ কয়েকটি সংখ্যক বার প্রদর্শিত হতে পারে, এক্সএসডি ১.০ সমাধানটি একত্রিতকারী বিস্ফোরণ ঘটাতে পারে, তাই না? যদিও এক্সএসডি 1.1 সমাধানটি পরিষ্কার থাকবে।
এব্রুচেজ

1
ebruchez, হ্যাঁ - ভাবপূর্ণ ক্ষমতা , যেমন আমি শব্দ ব্যবহার করেন, না হিসাবে একই succinctness , সংহতি , terseness , অথবা manageability । উদ্দীপক শক্তি কেবল জিজ্ঞাসা করে "এই আনুষ্ঠানিকতা কি এই ভাষার সংজ্ঞা দিতে পারে?" এটি ব্যাকরণের আকার সম্পর্কে বা কিছু সিনট্যাকটিক চিনি এটিকে আরও ছোট করে তুলবে কিনা সে সম্পর্কে জিজ্ঞাসা করে না। সংযুক্তিকরণ বিস্ফোরণ আপনি মানে যে সব গোষ্ঠীতে 1.1 পরিবর্তন XSD ছাড়া উপাদানের বৃহৎ সেট হ্যান্ডলিং খুবই কষ্টদায়ক হয়ে খুব দ্রুত উল্লেখ (এবং বৃহৎ জন্য এন মেমরির এক্সস্ট পারে)। এর অর্থ এই নয় যে তারা নীতিগতভাবে অসম্ভব হয়ে ওঠে।
সিএম স্পারবার্গ-ম্যাকউউইন

49

শেষ পর্যন্ত আমার পক্ষে এটিই কাজ করেছিল:

<xsd:element name="bar">
  <xsd:complexType>
    <xsd:sequence>
      <!--  Permit any of these tags in any order in any number     -->
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="child1" type="xsd:string" />
        <xsd:element name="child2" type="xsd:string" />
        <xsd:element name="child3" type="xsd:string" />
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

5
প্রকৃতপক্ষে কৌশলটি এক্সএসডি ব্যবহার করতে হবে: কোয়ানটিফায়ার্সের সাথে পছন্দ <xsd: পছন্দ minOccurs = "0" ম্যাকস্যাক্সার = "আনবাউন্ডেড">
টিভো

6
আমি মনে করি এটি উল্লেখ করা মূল্যবান যে উপরের উদাহরণটি পছন্দ-উপাদানটি ঘেরযুক্ত সিকোয়েন্স-এলিমেন্ট ছাড়াই কাজ করে।

9

তবে আমি যেটি এক্সকে বুঝি তা থেকে: পছন্দ এখনও কেবলমাত্র একক উপাদান নির্বাচনের অনুমতি দেয়। অতএব, ম্যাকস্যাকার্সকে আনবাউন্ডেড এ জাতীয় সেট করার অর্থ এই হওয়া উচিত যে শিশু উপাদানগুলির "যে কোনও একটি" একাধিকবার উপস্থিত হতে পারে। এটা কি সঠিক?

নং পছন্দ যে "পুনরাবৃত্তি" এর জন্য পৃথকভাবে ঘটে xs:choiceযে কারণে ঘটে maxOccurs="unbounded"। সুতরাং, আপনার পোস্ট করা কোডটি সঠিক, এবং লিখিত হিসাবে আপনি যা চান তা বাস্তবে করবে।


@ অ্যালান দ্বারা সরবরাহিত উত্তরের সাথে আপনার মন্তব্যগুলি এটিকে সুন্দরভাবে ব্যাখ্যা করেছে।
বোর

3

আপনার খুঁজে পাওয়া উচিত যে নীচের স্কিমা আপনার প্রস্তাবিত যা সেটি অনুমোদন করে।

  <xs:element name="foo">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:choice>
          <xs:element maxOccurs="unbounded" name="child1" type="xs:unsignedByte" />
          <xs:element maxOccurs="unbounded" name="child2" type="xs:string" />
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

এটি আপনাকে এমন একটি ফাইল তৈরি করার অনুমতি দেবে:

<?xml version="1.0" encoding="utf-8" ?>
<foo>
  <child1>2</child1>
  <child1>3</child1>
  <child2>test</child2>
  <child2>another-test</child2>
</foo>

যা আপনার প্রশ্নের সাথে মিলছে বলে মনে হচ্ছে।


minOccursএবং maxOccurs1 টির মধ্যে বাচ্চাদের জন্য সীমাবদ্ধ xs:all
পাভেল মিনায়েভ

পাভেল: ধন্যবাদ ... আমি আমার পোস্টটি ডাবল-চেক করার পরে এটি খুঁজে পেয়েছি এবং এরপরে এটি xs অপসারণ করার জন্য সম্পাদনা করেছি: সমস্ত
স্টিভেন_ডাব্লু

1

উপরের কোনওটি যদি কাজ না করে তবে আপনি সম্ভবত ইডিআই ট্র্যাস্যাকশন নিয়ে কাজ করছেন যেখানে আপনাকে এইচআইপিপিএ স্কিমা বা অন্য কোনও জটিল এক্সএসডি এর বিরুদ্ধে আপনার ফলাফলটি বৈধ করতে হবে। প্রয়োজনীয়তাটি হ'ল এখানে 8 টি আরএফ সেগমেন্ট বলুন এবং সেগুলির যে কোনও ক্রমে উপস্থিত থাকতে হবে এবং এটিরও সমস্ত প্রয়োজন হয় না, এর অর্থ আপনি নিজেরাই নিম্নলিখিত ক্রমানুসারে 1 ম আরএফ, তৃতীয় আরএফ, ২ য় আরএফ, নবম আরএফ থাকতে পারেন। ডিফল্ট পরিস্থিতিতে ইডিআই প্রাপ্তি ব্যর্থ হবে, বীজ কারণ ডিফল্ট জটিল ধরণ

<xs:sequence>
  <xs:element.../>
</xs:sequence>

পরিস্থিতি তখন আরও জটিল যখন আপনি নিজের উপাদানটিকে রেফারেন্সের মাধ্যমে ডাকছেন এবং তারপরে তার মূল স্পটটিতে থাকা উপাদানটি নিজেই বেশ জটিল। উদাহরণ স্বরূপ:

<xs:element>
<xs:complexType>
<xs:sequence>
<element name="REF1"  ref= "REF1_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF2"  ref= "REF2_Mycustomelment" minOccurs="0" maxOccurs="1">
<element name="REF3"  ref= "REF3_Mycustomelment" minOccurs="0" maxOccurs="1">
</xs:sequence>
</xs:complexType>
</xs:element>

সমাধান:

এখানে কেবল "সমস্ত" এর সাথে "ক্রম" প্রতিস্থাপন করা বা ন্যূনতম / সর্বাধিক সংমিশ্রণের সাথে "পছন্দ" ব্যবহার করা কার্যকর হবে না!

প্রথম জিনিসটি "xs:sequence" with "<xs:all>" এখন প্রতিস্থাপন করুন, আপনাকে কিছু পরিবর্তন করতে হবে যেখানে আপনি উপাদানটি উল্লেখ করছেন, সেখানে যান:

<xs:annotation>
  <xs:appinfo>
    <b:recordinfo structure="delimited" field.........Biztalk/2003">

*** এখন উপরোক্ত বিভাগে এই ট্রিগার_ফিল্ডের মতো শেষে ট্রিগার পয়েন্ট যুক্ত করুন "" আরএফএফ 01_... সম্পূর্ণ নাম .. "ট্রিগার_ভ্যালু =" 38 "অন্যান্য আরএফ বিভাগের জন্য একই করুন যেখানে ট্রিগার মান পৃথক হবে" 18 বলে " "," এক্সএক্সএক্স "," ওয়াইওয়াই "ইত্যাদি..তখন আপনার রেকর্ড তথ্যটি এখন দেখে মনে হচ্ছে:b:recordinfo structure="delimited" field.........Biztalk/2003" trigger_field="REF01_...complete name.." trigger_value="38">


এটি প্রতিটি উপাদানকে অনন্য করে তুলবে, কারণ সমস্ত আরএফ রেফার অংশগুলি (উপরের উদাহরণস্বরূপ) এর একই কাঠামো যেমন রেফ -01, আরএফ02, আরইএফ03 রয়েছে। এবং বৈধতার সময় কাঠামোর বৈধতা ঠিক আছে তবে এটি মানগুলি পুনরাবৃত্তি করতে দেয় না কারণ এটি প্রথম আরএফ-এ নিজেই বাকী মানগুলি অনুসন্ধান করার চেষ্টা করে। ট্রিগার যুক্ত করা এগুলি সবগুলিকে অনন্য করে তুলবে এবং এগুলি কোনও ক্রম এবং পরিস্থিতিগত ক্ষেত্রে (যেমন 5 এর বাইরে 9 ব্যবহার করুন এবং সমস্ত 9/9 নয়) পাস করবে।

আশা করি এটি আপনাকে সহায়তা করবে, কারণ আমি এটিতে প্রায় 20 ঘন্টা ব্যয় করেছি।

শুভকামনা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.