มีชื่อองค์ประกอบ XSLT หรือไม่


101

ใน XSLT มีไฟล์

<xsl:value-of select="expression"/>

เพื่อรับค่าขององค์ประกอบ แต่มีบางอย่างให้เลือกชื่อแท็กขององค์ประกอบหรือไม่

ในสถานการณ์เช่นนี้:

<person>
  <!-- required stuff -->
  <name>Robert</name>
  <!-- optional stuff, free form for future extension. 
       Using XMLSchema's xsd:any -->
  <profession>programmer</profession>
  <hobby>photography</hobby>
</person>

<xsl:for-each select="person">
   <xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>

เพื่อให้ได้ผลลัพธ์ดังนี้:

name : Robert
profession : programmer
hobby : photography

แน่นอน XSLT ข้างต้นจะไม่รวบรวมเพราะ

 <xsl:tag-of select="expression"/>

ไม่มีอยู่จริง แต่จะทำได้อย่างไร?


แท็กที่เกี่ยวข้องที่สุดสำหรับคำถามนี้คือ XPath ฟังก์ชันทั้งสองเป็นฟังก์ชันมาตรฐาน XPath และสามารถใช้ได้ภายในนิพจน์ XPath ในบริบทของภาษาที่โฮสต์ใด ๆ (C #, XSLT, XQuery, ... ) โปรดติดแท็กใหม่
Dimitre Novatchev

ข้อความนี้: "ใน XSLT มี <xsd: value-of select =" expression "/>" - มีข้อผิดพลาด คำนำหน้าที่มักใช้สำหรับคำแนะนำ XSLT คือ "xsl" โดยปกติเมื่อใช้ XML Schema เราจะใช้คำนำหน้า "xsd" หรือ "xs" กรุณาแก้ไข
Dimitre Novatchev

คำตอบ:


157

สิ่งนี้จะให้ชื่อองค์ประกอบปัจจุบัน (ชื่อแท็ก)

<xsl:value-of select ="name(.)"/>

OP-Edit:สิ่งนี้จะทำเคล็ดลับ:

<xsl:value-of select ="local-name()"/>

12
ชื่อท้องถิ่นคือสิ่งที่คุณต้องการ 9 ครั้งจาก 10
annakata

20
local-name คือ sans namespace ด้วยเหตุนี้จึงมักจะดีกว่า
Jon W

102

ไม่มีใครได้ชี้ความแตกต่างที่ลึกซึ้งในความหมายของฟังก์ชั่นและname()local-name()

  • name(someNode) ส่งคืนชื่อเต็มของโหนดและรวมคำนำหน้าและโคลอนในกรณีที่โหนดเป็นองค์ประกอบหรือแอตทริบิวต์
  • local-name(someNode) ส่งคืนเฉพาะชื่อท้องถิ่นของโหนดและไม่รวมคำนำหน้าและโคลอนในกรณีที่โหนดเป็นองค์ประกอบหรือแอตทริบิวต์

ดังนั้นในสถานการณ์ที่ชื่ออาจเป็นของสองเนมสเปซที่ต่างกันหนึ่งต้องใช้name()ฟังก์ชันเพื่อให้ชื่อเหล่านี้ยังคงแยกแยะได้

และ BTW เป็นไปได้ที่จะระบุทั้งสองฟังก์ชันโดยไม่มีข้อโต้แย้งใด ๆ :

name() เป็นคำย่อของ name(.)

local-name() เป็นคำย่อของ local-name(.)

สุดท้ายอย่าลืมว่าไม่เพียง แต่องค์ประกอบและแอตทริบิวต์เท่านั้นที่มีชื่อฟังก์ชันทั้งสองนี้ยังสามารถใช้กับ PI ได้และฟังก์ชันเหล่านี้จะเหมือนกัน)


15
<xsl:for-each select="person">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
  </xsl:for-each>  
</xsl:for-each>

ตามแนวทางปฏิบัติที่ดีควรใช้ normalize-space () เมื่อรับค่าของโหนด <xsl: value-of select = "normalize-space (.)" /> ซึ่งจะตัดช่องว่างพิเศษ
SO User

การทำให้เป็นมาตรฐาน / การฆ่าเชื้อดังกล่าวจะจำเป็นก็ต่อเมื่อไม่ได้รับการจัดการในขั้นตอนการรวบรวมข้อมูลเข้า ทำแล้วประหยัดไม่ต้องทำในเวลาเข้าถึงซึ่งมักจะไกลกว่า หนึ่งจะทำก่อนที่จะเพิ่มไปยัง RDB และเอกสาร xml เป็นเพียงฐานข้อมูลอื่น
Patanjali

9

สำหรับผู้ที่สนใจไม่มี:

<xsl:tag-of select="."/>

อย่างไรก็ตามคุณสามารถสร้างแท็ก / องค์ประกอบใหม่ได้โดยไปที่:

<xsl:element name="{local-name()}">
  <xsl:value-of select="substring(.,1,3)"/>
</xsl:element>

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


6
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>

ทำไมสิ่งนี้ถึงได้รับการโหวตลง? ได้รับอาจกล่าวถึงชื่อท้องถิ่น () หากคุณไม่ต้องการเนมสเปซเช่นกัน แต่จะเป็นประโยชน์กับชุมชนในวงกว้างในการอธิบายว่าเหตุใดจึงใช้ไม่ได้
Rowland Shaw

บางทีอาจไม่สามารถแปลง XML ที่กำหนดได้ ชื่อ (.) จะเป็น "บุคคล" ในกรณีนี้ ควรเป็น "ชื่อ" "อาชีพ" และ "งานอดิเรก"
Ray Lu

@CodeMelt ทำไมคุณถึงไม่ลงคะแนนคำตอบที่ยอมรับ? เป็นสิ่งที่ดี แต่มีความเฉพาะเจาะจงน้อยกว่านี้ ฉันโหวตคำตอบของ Rowland Shaw เนื่องจากให้คำตอบสำหรับคำถาม โปรดลงคะแนนเฉพาะเมื่อผู้ถามมีข้อมูลที่ไม่ถูกต้องไม่ถูกต้องหรือทำให้เข้าใจผิด
Dimitre Novatchev

4
แก้ไขรายละเอียดเล็ก ๆ น้อย ๆ นั้นโดยส่วนตัวฉันคิดว่าผู้คนควรอธิบายว่าทำไมบางสิ่งจึงถูกลดลงเนื่องจากจะช่วยอธิบายความรู้โดยรวม ...
Rowland Shaw

ชื่อเสียงของเราอาจดึงดูดความสนใจได้ แต่เนื่องจากไม่สามารถรับประกันได้ว่าสิ่งที่เราโพสต์นั้นคุ้มค่านั่นคือคุณภาพของการมีส่วนร่วมของเราที่มีความสำคัญอย่างแท้จริง ไม่มีเหตุผลใดที่ทำให้ผลงานมีคุณภาพต่ำ
Patanjali
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.