এক্সপ্যাথ একাধিক ট্যাগ নির্বাচন করতে


132

এই সরলীকৃত ডেটা ফর্ম্যাটটি দেওয়া হয়েছে:

<a>
    <b>
        <c>C1</c>
        <d>D1</d>
        <e>E1</e>
        <f>don't select this one</f>
    </b>
    <b>
        <c>C2</c>
        <d>D2</d>
        <e>E1</e>
        <g>don't select me</g>
    </b>
    <c>not this one</c>
    <d>nor this one</d>
    <e>definitely not this one</e>
</a>

আপনি কীভাবে সমস্ত Cএস, Dএস এবং Eএসগুলি Bউপাদানগুলির সন্তান হিসাবে বেছে নেবেন ?

মূলত: এরকম কিছু:

a/b/(c|d|e)

আমার নিজের অবস্থা, ঠিক করার পরিবর্তে a/b/, ক্যোয়ারী সেই নির্বাচন অগ্রসর হওয়ার C, D, Eনোড আসলে বেশ জটিল, তাই আমি এই কাজ এড়াতে চাই:

a/b/c|a/b/d|a/b/e

এটা কি সম্ভব?

উত্তর:


207

একটি সঠিক উত্তর হ'ল :

/a/b/*[self::c or self::d or self::e]

এই নোট করুন

a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

উভয় খুব দীর্ঘ এবং ভুল । এই এক্সপথ এক্সপ্রেশনটি নোডগুলি নির্বাচন করবে:

OhMy:c

NotWanted:d 

QuiteDifferent:e

2
'বা' একে অপরের জন্য কাজ করে না, এর পরিবর্তে আপনাকে উলম্ব রেখা ব্যবহার করতে হবে '|'
গুয়াসেকো

8
@ গুয়াসেকোও orএকটি লজিকাল অপারেটর - এটি দুটি বুলিয়ান মানকে নিয়ে কাজ করে। এক্সপ্যাথ ইউনিয়ন অপারেটর |দুটি সেট নোডে কাজ করে। এগুলি একেবারেই আলাদা এবং তাদের প্রত্যেকের জন্য নির্দিষ্ট ব্যবহারের কেস রয়েছে। ব্যবহারটি আসল সমস্যাটি সমাধান | করতে পারে তবে এক্সপথ এক্সপ্রেশন বুঝতে এটি আরও দীর্ঘ এবং আরও জটিল এবং চ্যালেঞ্জিংয়ের ফলস্বরূপ। এই উত্তরের সরল অভিব্যক্তি, যা orঅপারেটরটি ব্যবহার করে ওয়ান্টেড নোড-সেট উত্পাদন করে এবং একটি এক্সএসএলটি অপারেশনের "নির্বাচন করুন" বৈশিষ্ট্যে নির্দিষ্ট করা যেতে পারে <xsl:for-each>। এটা চেষ্টা করুন.
দিমিত্রে নোভাচেভ

4
@ জোনাথনবেইন, যে কেউ "নেমস্পেসের বিষয়ে চিন্তা করে না" আসলে এক্সএমএল সম্পর্কে চিন্তা করে না এবং এক্সএমএল ব্যবহার করে না। ব্যবহারের local-name()নামস্থান উপাদানের ক্ষেত্রে একমাত্র সঠিক যদি আমরা যে স্থানীয় নাম দিয়ে সব উপাদান নির্বাচন করতে চান হয়, নির্বিশেষে এটি একটি খুব বিরল ক্ষেত্রে দেখা যায় - সাধারণ মানুষের মধ্যে ভিন্নতা নিয়ে যত্ন না। kitchen:tableএবং sql:table, বা মধ্যে architecture:column, sql:column, array:column,military:column
Dimitre Novatchev

2
@ দিমিত্রে নোভাচেভ আপনি একটি ভাল বক্তব্য রেখেছেন। আমি এইচটিএমএল পরিদর্শনের জন্য এক্সপথ ব্যবহার করছি, এটি এমন এক প্রান্তের ক্ষেত্রে যেখানে নাম স্থানটি এত গুরুত্বপূর্ণ নয় ...
জোনাথন বেন

2
এটি সুপার। তুমি কোথায় এলে?
কিথ টাইলার

46

পরিবর্তে কোনও গুণাবলী পরীক্ষা দিয়ে আপনি পুনরাবৃত্তি এড়াতে পারবেন:

a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

দিমিত্রের বিরোধী মতামতের বিপরীতে, উপরের কোনও শূন্যস্থানে ভুল নয় যেখানে ওপি নেমস্পেসের সাথে ইন্টারঅ্যাকশন নির্দিষ্ট করে নি। self::অক্ষ নামস্থান নিয়ন্ত্রণমূলক হয়, local-name()নয়। যদি নেপথ্যে c|d|eনির্বিশেষে ওপির উদ্দেশ্যটি ক্যাপচার করা হয় (যা আমি প্রস্তাব করি যে সমস্যার ওআর প্রকৃতির ভিত্তিতে এটি একটি সম্ভাব্য পরিস্থিতিও রয়েছে) তবে এটি "অন্য উত্তর যা এখনও কিছু ইতিবাচক ভোট পেয়েছে" যা ভুল is

আপনি সংজ্ঞা ব্যতীত চূড়ান্ত হতে পারবেন না, যদিও আমার উত্তর যথাযথভাবে ভুল হিসাবে মুছে ফেলতে পেরে আমি বেশ খুশি, যদি ওপি তার প্রশ্নটি এমনভাবে ব্যাখ্যা করে যে আমি ভুল।


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

4
ঠিক আমি খুঁজছেন ছিল কি. এক্সএমএল নেমস্পেসগুলি যেভাবে তারা বাস্তব জীবনে ব্যবহৃত হয় তা একটি অপরিষ্কার গণ্ডগোল। / A / b / ( : c | : d | * e) এর মতো কিছু নির্দিষ্ট করতে সক্ষম না হওয়ায় আপনার সমাধানটি ঠিক যা প্রয়োজন তা ঠিক। পিউরিস্টরা তাদের যা চান তার সব তর্ক করতে পারে তবে ব্যবহারকারীরা অ্যাপ্লিকেশনটি বিরল হওয়ার বিষয়টি বিবেচ্য নয় কারণ তাদের ইনপুট ফাইলটি যা কিছু সৃষ্টি করেছে তা নেমস্পেসগুলি খারাপ করেছে। তারা কেবল এটি কাজ করতে চায়।
ঘোস্ট্রিডার

7
এই দুটি উত্তরের মধ্যে পার্থক্য কী হবে তা আমার কাছে কেবল অস্পষ্ট ধারণা আছে এবং কেউই ব্যাখ্যা করতে মাথা ঘামায় না। "নামস্থান সীমাবদ্ধ" এর অর্থ কী? যদি আমি ব্যবহার করি local-name(), তার মানে কি এটি কোনও নামের জায়গার সাথে ট্যাগগুলি মেলে? আমি যদি ব্যবহার করি self::তবে এটির সাথে কোন নামের স্থানটি মিলবে? আমি কিভাবে মেলে OhMy:c?
meustrus

15

না কেন a/b/(c|d|e)? আমি স্যাকসন এক্সএমএল লাইব্রেরিটি দিয়ে চেষ্টা করেছি (কিছু ক্লোজুর ধার্মিকতার সাথে সুন্দরভাবে গুটিয়ে রেখেছি), এবং এটি কার্যকর বলে মনে হচ্ছে। abc.xmlওপি দ্বারা বর্ণিত ডক

(require '[saxon :as xml])
(def abc-doc (xml/compile-xml (slurp "abc.xml")))
(xml/query "a/b/(c|d|e)" abc-doc)
=> (#<XdmNode <c>C1</c>>
    #<XdmNode <d>D1</d>>
    #<XdmNode <e>E1</e>>
    #<XdmNode <c>C2</c>>
    #<XdmNode <d>D2</d>>
    #<XdmNode <e>E1</e>>)

8
হ্যাঁ, তবে এটি

এটি আমার পক্ষে ভাল কাজ করেছে। দেখে মনে হচ্ছে এক্সপথ ২.০ পাইথন ২-এ এইচটিএমএল পার্স করার জন্য ডিফল্ট
মার্টিন

-1

এটি সাহায্য করে কিনা তা নিশ্চিত নন, তবে এক্সএসএল দিয়ে আমি এরকম কিছু করব:

<xsl:for-each select="a/b">
    <xsl:value-of select="c"/>
    <xsl:value-of select="d"/>
    <xsl:value-of select="e"/>
</xsl:for-each>

এবং এই এক্সপথটি বি নোডের সমস্ত বাছাই করবে না:

a/b/*

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

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