এসকিউএল সার্ভার MLোকানো হলে এক্সএমএল কাঠামো পরিবর্তন করে


15

আমি এসকিউএল সার্ভারে একটি এক্সএমএল কলামে কিছু এক্সএমএল ডেটা .োকাচ্ছি তবে ডেটা সন্নিবেশ করার পরে এটি এসকিউএল সার্ভার দ্বারা পরিবর্তন করা হয়েছে। আমি প্রবেশ করানো ডেটা এখানে

              <xsl:value-of select="name/n/given" />
            <xsl:text> </xsl:text>
          <xsl:value-of select="name/n/family" />

আমি যখন এটি আবার পড়ি, তখন এটির মতো দেখাচ্ছে

              <xsl:value-of select="name/n/given" />
          <xsl:text />
          <xsl:value-of select="name/n/family" />

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

এটি সমাধান করার কোনও উপায় আছে?


এটি একটি সমস্যা, কারণ এটি কীভাবে এক্সএসএলটি রূপান্তর আউটপুট হবে তা পরিবর্তন করে। প্রথম লাইন প্রদত্ত এবং পরিবারের নামের মধ্যে একটি স্থান তৈরি করবে, যখন দ্বিতীয়টির মধ্যে কোনও স্থান তৈরি করবে না, সুতরাং এটি জন জনসনের মতো হবে, যখন প্রথমটি জন জনসনের মতো হবে
মিঃ জ্যাচ

এইচএমএইচএম, উপযুক্ত স্থানটি এটি "" তবে এই মন্তব্যের মতো একটি জায়গা নয় (আপনি এটি দেখতে পারবেন না)
a_vlad

1
সম্ভবত আপনি এমন একটি নিয়ন্ত্রণ অক্ষর ব্যবহার করতে পারেন যা ডেটাতে (যেমন _বা ~) উপস্থিত নেই এবং তারপরে উপস্থাপনের সময় কোনও স্থান দিয়ে এটি প্রতিস্থাপন করতে পারেন।
অ্যারন বারট্রান্ড

উত্তর:


25

আপনি xml:space = "preserve"যে নোডগুলিতে জায়গা রাখতে চান সেখানে আপনি ব্যবহার করতে পারেন । এক্সএমএল: স্পেস ব্যবহার করা "কেবলমাত্র অভিপ্রায়ের একটি সংকেত" তবে এসকিউএল সার্ভারটি আমাদের এখানে দয়াবান।

একটি নোডের জন্য

declare @X xml =
'<root>
  <element xml:space = "preserve"> </element>
  <element> </element>
</root>'

select @X;

ফলাফল:

<root>
  <element xml:space="preserve"> </element>
  <element />
</root>

পুরো দস্তাবেজ:

declare @X xml =
'<root xml:space = "preserve">
  <element> </element>
  <element> </element>
</root>'

select @X;

ফলাফল:

<root xml:space="preserve">
  <element> </element>
  <element> </element>
</root>

পুরো নথির জন্য অন্য বিকল্প হ'ল স্টাইল 1 এর সাথে রূপান্তর ব্যবহার করা ।

তুচ্ছ সাদা জায়গা সংরক্ষণ করুন। এই স্টাইলের সেটিংটি ডিফল্ট এক্সএমএল সেট করে: এক্সএমএল: স্পেস = "সংরক্ষণ করুন" এর আচরণের সাথে মেলে স্থান হ্যান্ডলিং।

declare @X xml = convert(xml, 
'<root>
  <element> </element>
  <element> </element>
</root>', 1)

select @X;

আকর্ষণীয় যে এটি প্রয়োজন। হোয়াইটস্পেস কোনটি "তুচ্ছ" তা সিদ্ধান্ত নেওয়ার জন্য এসকিউএল সার্ভারের রেমিট হওয়া উচিত নয় এবং নথিপত্র পরিবর্তন ছাড়াই নীরবে এটিকে ছাঁটাই করে দেওয়া উচিত!
মনিকার সাথে লাইটনেস রেস

3
@ লাইটনেসেসেসিনআরবিট এসকিউএল সার্ভারের প্রয়োগের ফলে আমি বেশ খুশি। এক্সএমএলে ফর্ম্যাটিং (হোয়াইটস্পেস) এটি না বলা অবধি গুরুত্বপূর্ণ বলে বিবেচিত হবে না। নথিতে আসলে নোডের সংখ্যা এবং এটি স্টোরেজ আকারে কী করে তা দেখতে এই উদাহরণটি দেখুন:
মিকেল এরিকসন

3
আমি এটিকে একটি স্পষ্ট লঙ্ঘন হিসাবে বিবেচনা করি, কারণ এখানে ডেটাটি এক্সএমএল হিসাবে স্বীকৃত এবং এক্সএমএল হিসাবে সঞ্চিত রয়েছে, কোনও হেরফের বা রূপান্তর বা এক্সএমএল-স্তর শেনানিগানের অন্য কোনও রূপ ছাড়াই ডকুমেন্টটি সংরক্ষণ করা (অবশ্যই), সুতরাং আচরণটি হওয়া উচিত "অ্যাপ্লিকেশন" না হয়ে একটি "প্রসেসর" এর মধ্যে পড়ুন এবং তাই অবশ্যই হোয়াইটস্পেস স্ট্রিপ করা উচিত নয়
মনিকার সাথে লাইটনেস রেস

9

এসকিউএল সার্ভার ডকুমেন্টেশনের এই পৃষ্ঠাটি বলছে

তথ্যটি একটি অভ্যন্তরীণ উপস্থাপনায় সংরক্ষণ করা হয় যা ... XML পাঠ্যের অনুরূপ অনুলিপি নাও থাকতে পারে, কারণ নিম্নলিখিত তথ্যটি ধরে রাখা হয়নি: তুচ্ছ সাদা স্থান, বৈশিষ্ট্যের ক্রম, নামের স্থানের উপসর্গ এবং এক্সএমএল ঘোষণা।

আপনার উদাহরণের জন্য আমি অনুমান করি এটি মধ্যম ট্যাগের সাদা স্থানটিকে তাত্পর্যপূর্ণ না বলে বিবেচনা করে এবং তাই প্রতিনিধিত্বকে রিফ্যাক্টর করতে মুক্ত। আমি মনে করি না যে এর জন্য কোনও সমাধান আছে; এটি ঠিক কীভাবে এসকিউএল সার্ভার এক্সএমএল ডেটা টাইপ প্রয়োগ করে।

@ অ্যারোন যেমন বলেছে তেমন কাজের জায়গায় সাদা জায়গার পরিবর্তে স্থানধারক ব্যবহার করা অন্তর্ভুক্ত থাকবে। গ্রাহককে অবশ্যই এই টোকেনগুলি সন্নিবেশ করানো এবং ফেলা করতে হবে remember বিকল্প হিসাবে এক্সএমএলের পরিবর্তে কলামটি এনভারচর হিসাবে সংজ্ঞায়িত করুন। এটি অবশ্যই সমস্ত সাদা স্থান এবং অন্য কোনও ফর্ম্যাটিং সংরক্ষণ করবে। একটি দ্রুত উদাহরণ:

create table x(i nvarchar(99), j xml);
insert x values ('<a> </a>', '<a> </a>');  -- note the space
select * from x

i           j
----------  -------
<a> </a>    <a />  

এনভারচর কলামটি ইনপুট ফর্ম্যাটটি সংরক্ষণ করে, এক্সএমএল কলামটি এটি করে না।

আপনি এসকিউএল কোয়েরিতে এক্সপ্যাট ব্যবহার করার ক্ষমতা হারাবেন। যদি এক্সএমএল কেবলমাত্র অ্যাপ্লিকেশনটিতে ছিটিয়ে থাকে তবে এটি অবিরাম। অক্ষরের স্ট্রিংটি ডিবিতে সঞ্চয় স্থান সঙ্কুচিত করা যেতে পারে, যদি এটি আপনার জন্য গুরুত্বপূর্ণ।


আপনি সম্ভবত এখনও এক্সএমএল সংস্করণটির বিপরীতে প্রশ্নগুলিতে এক্সপিএটিএইচ ব্যবহার করতে পারেন, এমনকি যদি আপনি এটির তুচ্ছ জায়গার জন্য হিট (বা মিস) এর উপর নির্ভর না করেন ততক্ষণ আপনি এটি পুনরায় ফর্ম্যাট করতে দেন।
অ্যারন বারট্রান্ড

0

CDATAডেটা সংরক্ষণ করার সময় আপনি নিজের স্থানটি গুটিয়ে রাখতে পারেন:

<xsl:text><![CDATA[ ]]></xsl:text>

এটি প্রদর্শিত হয় যে এসকিউএল সার্ভার তারপরে স্থানটি অভ্যন্তরীণভাবে রাখে, তবে CDATAফলাফলটি ব্যবহার করে ফিরে আসার সময় অপ্রয়োজনীয় মার্কআপটি সরিয়ে দেয় SELECT। ভাগ্যক্রমে, স্থানটি এই জাতীয় ফলাফলের পুনরায় ব্যবহার করার সময় রাখা হয় SELECT:

DECLARE @X XML = '<text><![CDATA[ ]]></text>'
DECLARE @Y XML

SET @Y = (SELECT @X)

SELECT @Y

ফলাফলটি হবে:

<text> </text>

সিডিএটিএ চেষ্টা করেও এটি সরানো হয়েছে।
মিঃ জাচ

@ মিঃজ্যাচ সিডিটিএ নিজেই সরানো হয়েছে, তবে স্থান বাকি রয়েছে। (এসকিউএল এক্সপ্রেস 2016 এ চেষ্টা করা হয়েছে))
ব্রুনো

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