สองแนวคิดจาก XSLT ในภาษาอื่น: Apply-templates และ xpath

ความเป็นมา: หลังจากละทิ้งการใช้ XSLT ในทางปฏิบัติในแต่ละวันโดยเป็นส่วนหนึ่งของชุดเครื่องมือการเขียนโปรแกรมของฉัน ฉันสงสัยว่ามีการใช้งานในภาษาอื่นของสองสิ่งที่ฉัน (เท่านั้น) พลาดเกี่ยวกับเครื่องมือนั้นหรือไม่ : :

  • ความสามารถในการสำรวจโครงสร้างข้อมูลโดยใช้รูปแบบ "เส้นทาง" ผ่าน xpath
  • ความสามารถในการสำรวจการแปลงเทมเพลตโดยใช้เทมเพลต Apply แทนการใช้วิธีวนซ้ำหรือ "วนซ้ำ"

จากข้อมูลของ Google มีความพยายามสองสามครั้งในการเพิ่มการรองรับ "xpath-style" ให้กับ Javascript แต่สิ่งเหล่านี้ดูเหมือนจะไม่ค่อยได้รับความสนใจมากนัก จนถึงตอนนี้ฉันยังไม่พบอะไรที่มีคนใช้แนวทาง "ใช้เทมเพลต" ในภาษาอื่น

คำถาม: มีใครบ้างที่รู้จักภาษาการเขียนโปรแกรม (หวังว่าจะเป็นภาษากระแสหลัก) ที่ขโมยแนวคิดดีๆ ทั้งสองนี้จาก XSLT หรือใช้แนวคิดเดียวกันหรือคล้ายกันโดยใช้วิธีอื่น


person dreftymac    schedule 17.07.2009    source แหล่งที่มา
comment
ตามข้อกำหนดกำหนด XSLT ไม่ได้มีจุดมุ่งหมายให้เป็นภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป (เช่น คุณไม่สามารถทำการแปลง XSLT บน JSON ได้) ดังนั้นแม้ว่า XSLT จะสมบูรณ์แบบสำหรับฉัน แต่ก็ยังมีการใช้งานที่จำกัดเท่านั้น เนื่องจาก XML ไม่ใช่รูปแบบข้อมูลเดียวของฉัน .   -  person dreftymac    schedule 18.07.2009
comment
ลองดู json2xml: goessner.net/download/prj/jsonxml กล่าวถึงที่นี่: xml.com/pub/a/2006 /05/31/converting-between-xml-and-json.html   -  person Mads Hansen    schedule 19.08.2009


คำตอบ (5)


ความสามารถในการสำรวจโครงสร้างข้อมูลโดยใช้รูปแบบ "เส้นทาง" ผ่าน xpath

ฉันไม่ทราบภาษาอื่นใดที่ฝัง XPath แต่ LINQ เป็น XML ค่อนข้างคล้ายกันโดยเฉพาะใน น้ำตาลวากยสัมพันธ์ VB คุณสามารถนำไปใช้ในมาโคร Common Lisp หรือเทมเพลต D ได้

ความสามารถในการสำรวจการแปลงเทมเพลตโดยใช้เทมเพลต Apply แทนการใช้วิธีวนซ้ำหรือ "วนซ้ำ"

ไม่มีภาษากระแสหลักที่ฉันรู้ อันที่จริง คุณลักษณะนี้อาจเป็นเหตุผลหลักในการใช้ XSLT (และไม่ใช่เช่น XQuery ที่ดูภาษาที่เกี่ยวข้องอย่างใกล้ชิด)

มันเป็นการส่งไดนามิกที่ขยายได้อย่างมีประสิทธิภาพบนตัวรับตามเงื่อนไขที่กำหนดเอง - เช่นนี้ฉันคิดว่าคุณน่าจะทำได้ใน Common Lisp (เฉพาะเจาะจง CLOS) - ถ้าฉันจำได้อย่างถูกต้อง multimethods ของมันสามารถตรงกับเงื่อนไขที่กำหนดเองได้ ดังนั้นหากคุณมี XPath ผู้ประเมินรูปแบบ คุณสามารถใช้มันเพื่อจำลอง apply-templates และอื่นๆ อีกมากมาย เนื่องจาก apply-templates จัดส่งเฉพาะอาร์กิวเมนต์เดียว ในขณะที่มัลติเมธอด CLOS จัดส่งหลายอาร์กิวเมนต์

person Pavel Minaev    schedule 17.07.2009

XPath แม้ว่าจำเป็นต่อการทำงานของ XSLT แต่ก็เป็นอิสระจากมัน ไลบรารีเช่น libxml ให้คุณฟรี รูปแบบของแอปพลิเคชันเทมเพลตที่คุณอธิบายนั้นซับซ้อนกว่าเล็กน้อย นั่นคือสิ่งที่ปกติคุณจะใช้ XSLT

ภาษาโปรแกรมใด ๆ ที่ทำสิ่งนี้ควรจะใช้งานได้ คุณสามารถลองเขียนภาษา XSLT ของคุณเองที่ละเอียดน้อยลงได้ Perl ยังอาจให้เชือกแก่คุณมากพอที่จะเลียนแบบคุณลักษณะนี้ได้อย่างน่าเชื่อ (แม้ว่าความหมายของประสิทธิภาพจะไม่ชัดเจนก็ตาม)

คำตอบที่ยากก็คือสิ่งนี้ไม่มีอยู่จริง ยกเว้นเป็นห้องสมุดสำหรับภาษาที่มีอยู่แล้ว

person Edward Z. Yang    schedule 17.07.2009

สำหรับ XPath แน่นอน สำหรับ C มี Xalan-C++ สำหรับ Java javax.xml.xpath (ที่มีหลายรายการ การใช้งาน) และ C# มี XPathNavigator และ เลือกโหนด หากคุณต้องการใช้ XPath สำหรับลำดับชั้นของออบเจ็กต์ โปรดดูที่ JXPath

สำหรับการแปลงเทมเพลต คุณควรดูที่ LINQ ของ C# หากคุณยังไม่ได้ ไม่ได้แล้ว มันไม่เหมือนกันทุกประการ แต่ช่วยให้สามารถประมวลผลวัตถุได้โดยไม่ต้องวนซ้ำอย่างชัดเจน

person Matthew Flaschen    schedule 17.07.2009

ฉันไม่พบอะไรเช่นนั้น แต่ทำไมใครๆ ก็ใช้อย่างอื่นเพื่อแปลง XML ล่ะ XSLT จะทำงานสมบูรณ์แบบเมื่อคุณเข้าใจวิธีการพัฒนาโซลูชันแบบไม่ต้องใช้ขั้นตอน แอปพลิเคชันของเราใช้ XSLT เป็นส่วนใหญ่ และเป็นเครื่องมือที่ทรงพลังมาก

person PetervanBoheemen    schedule 17.07.2009
comment
จุดประสงค์ไม่ใช่เพื่อแปลง XML แต่เป็นการแปลงโครงสร้างข้อมูลที่กำหนดเอง (เช่น JSON) โดยใช้ภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป (แทนที่จะเป็นภาษาที่ไม่มีวัตถุประสงค์ทั่วไป เช่น XSLT) - person dreftymac; 18.07.2009
comment
XSLT 2.0 มีคุณลักษณะใหม่ๆ มากมายที่ทำให้แยกวิเคราะห์ไฟล์ที่ไม่ใช่ XML ได้ง่ายขึ้น เช่น JSON (เช่น unparsed-text() นิพจน์ทั่วไป ฯลฯ) แทนที่จะมองหาทางเลือกอื่นแทน XSLT ลองดูว่าคุณสามารถบรรลุสิ่งที่คุณต้องการด้วย XSLT 2.0 ได้หรือไม่ - person Mads Hansen; 19.08.2009

ความคิดเห็นเกี่ยวกับความต้องการแรกของคุณ:

  • ความสามารถในการสำรวจโครงสร้างข้อมูลโดยใช้รูปแบบ "เส้นทาง" ผ่าน xpath

XPath ตั้งสมมติฐานมากมายเกี่ยวกับโครงสร้างข้อมูล หากคุณกำลังจะใช้ คุณอาจต้องแปลงโครงสร้างของคุณเป็น XML ด้วยเช่นกัน เพราะมันจะมีลักษณะเช่นนี้อยู่แล้วเมื่อคุณทำให้สามารถข้ามผ่านภาษาที่คล้ายกับ XPath บางภาษา เว้นแต่คุณจะจำกัดเซ็ตย่อย XPath ของคุณอย่างรุนแรง

นอกจากนี้ โปรดทราบว่า "มีเพียงสองสิ่ง" ที่คุณขาดหายไป นั่นคือ XPath และการประมวลผลเทมเพลต จริงๆ แล้วเป็นส่วนสำคัญของสิ่งที่ประกอบขึ้นเป็น Xslt ฉันสงสัยว่าทำไมคุณถึงตัดสินใจถอดมันออกจากเข็มขัดเครื่องมือ

แม้ว่าคุณต้องการทางเลือก Xslt ฉันยังคงแนะนำ Xslt และ Xslt 2.0 โดยเฉพาะ ด้วยการเพิ่ม unparsed-text และ analyze-string คุณมีภาษาการประมวลผลข้อความที่มีประสิทธิภาพ ตัวอย่างเช่น ดูที่ CSV ไปยังสไตล์ชีต XML แม้ว่า JSON จะไม่ใช่แบบปกติ แต่คุณยังคงสามารถเขียนตัวแปล JSON เป็น XML แบบธรรมดาได้โดยใช้เทมเพลตแบบเรียกซ้ำและแปลงผลลัพธ์ตามต้องการ

person Chris Scott    schedule 20.07.2009
comment
ขอบคุณสำหรับความคิดเห็นของคุณ คุณได้พูดถึงประเด็นหนึ่งแล้ว การแปลงทุกโครงสร้างให้เป็นแพ็กเก็ตข้อมูล XML มีแง่มุมที่ค่อนข้างยุ่งยาก ยิ่งไปกว่านั้น XSLT ยังยอดเยี่ยมสำหรับสิ่งที่มันทำ แต่มีบางอย่างที่ต้องกล่าวถึงสำหรับภาษาการเปลี่ยนแปลงที่มีจุดประสงค์ทั่วไปล้วนๆ ยังไม่ชัดเจนว่า XSLT 2.0 จะเรียกเก็บเงินตามนั้นหรือไม่ หากเป็นเช่นนั้นก็ต้องรอดูผลต่อไป - person dreftymac; 20.07.2009
comment
ฉันค่อนข้างแน่ใจว่าคนส่วนใหญ่จะยอมรับว่า XSLT ไม่ใช่สิ่งที่มีวัตถุประสงค์ทั่วไป อย่างไรก็ตาม ฉันอยากรู้ว่าถ้าคุณมีกรณีการใช้งานเฉพาะในใจเป็นรหัสหลอกหรือไม่ หากมีบางสิ่งที่มีวัตถุประสงค์ทั่วไป คุณจะกำหนดโครงสร้างของมันอย่างไร และจะเคลื่อนที่ไปยังหม้อแปลงได้อย่างไร? ฉันเดาว่าคำจำกัดความคงจะยุ่งยากพอที่จะพิสูจน์การแปลงโครงสร้างข้อมูลของคุณเป็น XML อย่างไรก็ตาม หากคุณมีไวยากรณ์ที่ค่อนข้างสวยงามอยู่ในใจ นั่นอาจเป็นแนวคิดที่ดีสำหรับโปรเจ็กต์นี้ - person Chris Scott; 20.07.2009
comment
หากคุณสามารถเปรียบเทียบ JSON กับ XML ได้ ก็มีความคล้ายคลึงกันบางประการ ทั้งสองใช้เพื่อระบุโครงสร้างที่กำหนดเองโดยอาจมีการซ้อนหลายระดับ นอกจากนี้ การกำหนดรูปแบบ xpath ของ JSON ได้ถูกกล่าวถึงมาก่อน (ดูเช่น goessner.net/articles/JsonPath ) - person dreftymac; 21.07.2009