วิธีแทรก & nbsp; ใน XSLT


207

ฉันจะแทรกได้อย่างไร

 

เป็นสไตล์ชีท XSLT ฉันได้รับข้อผิดพลาดนี้:

ข้อผิดพลาดในการแยกวิเคราะห์ XML: เอนทิตีที่ไม่ได้กำหนด

โดยพื้นฐานแล้วฉันต้องการตัวละครที่ไม่มีช่องว่างในเทมเพลต XSLT


2
คุณสามารถใช้ & # xA0; เหมือนกับ & # 160; ดูที่นี่stackoverflow.com/questions/7511214/…
3766111

คำตอบ:


337

ใช้รหัสเอนทิตี แทน

 คือ HTML "การอ้างอิงเอนทิตีของอักขระ" ไม่มีชื่อนิติบุคคลสำหรับพื้นที่ที่ไม่ทำลายในรูปแบบ XML  เพื่อให้คุณใช้รหัส

Wikipedia มีรายการของเอนทิตี XML และ HTMLและคุณจะเห็นว่ามีเพียง 5 "เอนทิตีที่กำหนดไว้ล่วงหน้า" ใน XML แต่ HTML มีมากกว่า 200 ฉันจะชี้ไปที่การสร้างช่องว่าง (& nbsp;) ใน XSLซึ่งมี คำตอบที่ยอดเยี่ยม


3
เราพบกับสถานการณ์เมื่อเร็ว ๆ นี้ที่หนึ่งในหลาย ๆ XSL หยุดทำงานกับเทคนิคนี้และเริ่มแสดงตัวละครแปลก ๆ อย่างไรก็ตามถ้าฉันใช้เทคนิค CDATA ของ WaterSoul มันก็ใช้ได้

@BrianReindel ซึ่งอาจหมายถึงว่าคุณใช้การอ้างอิงเอนทิตีตัวเลขที่ไม่ถูกต้องเช่นŠแทนที่จะ เป็นหลังซึ่งจะแก้ไขพื้นที่ Unicode ที่ไม่ทำลายเสมอ
Abel

ลิงค์Top Ten Java และ XSLT Tipsมีประโยชน์จริง ๆ
LCJ

<xsl: text> & # 160; </ xsl: text> มันแยกทั้งสองฟิลด์
Manash Ranjan Dakua

1
ลิงก์เสีย
GSerg

37

&#160;ทำงานได้ดีจริงๆ อย่างไรก็ตามมันจะแสดงหนึ่งในตัวละครแปลก ๆ เหล่านั้นในการเข้ารหัส ANSI <xsl:text>ทำงานได้ดีที่สุดสำหรับฉัน

<xsl:text> </xsl:text>

3
การใช้คำตอบที่ยอมรับฉันลงเอยด้วยการแบ่งบรรทัดในเอาต์พุต XML ของฉัน (อย่างน้อยนั่นคือสิ่งที่ดูเหมือนในเครื่องมือแก้ไข XML ของ VS2010) ใช้คำตอบนี้ฉันได้รับ 1 ช่องว่างเท่านั้น
Mathijs Flietstra

1
@ Matijij นี่คือช่องว่างไม่ใช่ช่องว่างที่ไม่ทำลายซึ่งไม่เหมือนกัน หาก VS แสดงว่าไม่ถูกต้องให้ตรวจสอบการเข้ารหัสของคุณ (VS สามารถแสดงสิ่งนี้ได้อย่างถูกต้องและควรเข้ารหัสอย่างอิสระดังนั้นคุณน่าจะทำผิดอย่างอื่นมากกว่า)
Abel

25

ท่านสามารถทำได้:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

2
สิ่งนี้จะใช้งานได้หากโปรเซสเซอร์รองรับdisable-output-escapingซึ่งไม่จำเป็นต้องใช้และเลิกใช้ใน XSLT 2.0 และอื่น ๆ ใน 3.0 ในรุ่นเหล่านี้คุณสามารถเข้าถึงเอฟเฟกต์เดียวกันได้ด้วยxsl:character-mapการรับประกันว่าจะสามารถทำงานข้ามโปรเซสเซอร์ได้ นอกจากนี้ยังวางเอนทิตีที่ระบุชื่อ&nbsp;ไว้ในเอาต์พุตซึ่งไม่จำเป็นต้องเหมือนกับพื้นที่ไม่แตกหักและจุดสิ้นสุดการรับจะต้องมีเอนทิตีนี้ (ใน HTML โดยปกติจะเป็นแบบปริยาย)
Abel

21

ใช้สิ่งนี้

<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;

แก้ไข: Downvoters อาจตรวจสอบว่างานนี้เป็นครั้งแรก (มันและเป็นวิธีการแก้ปัญหาทั่วไปมากที่สุด)


1
ไม่แน่ใจ แต่ฉันได้ทดสอบวิธีการของฉันแล้วและได้ผลฉันจึงไม่แน่ใจว่า downvote นั้นสำหรับ :(
jagprinderdeep

2
นอกจากนี้คำตอบที่ยอมรับจะไม่ถูกต้องสำหรับตัวแยกวิเคราะห์ทั้งหมดตามหน้าที่เชื่อมโยง; เพียงหัวขึ้น
jagprinderdeep

1
ฉันเคยให้เหตุผลสำหรับ downvote ของฉันก่อนหน้านี้ แต่ถ้าฉันต้อง downvote คำตอบนี้แล้วเหตุผลก็คือ - มันตอบคำถามผิด OP ถามวิธีการใส่พื้นที่ที่ไม่สามารถแตกได้อย่างชัดเจนโดยใช้ xslt และคุณตอบว่าจะใส่ลำดับแอมเปอร์แซนด์และ-nbsp-semicolon ได้อย่างไร และการทะเลาะกันเรื่อง downvotes ก็ไม่จำเป็นเช่นกัน แต่อย่างจริงจังคุณไม่เคยพูดเกี่ยวกับ CDATA หรือไม่?
Michael Krelin - แฮกเกอร์

1
โอเค jagprinderdeep ฉันเพิกถอน downvote ของฉัน แต่ในทางกลับกันโปรดไปเยี่ยมฉันเมื่อฉันตีโรงพยาบาลโรคจิต (โปรดทราบว่าฉันไม่ให้คะแนนโหวตกลับด้วยเหตุผลใหม่นี้) แต่เข้าใจว่าคุณตอบคำถามผิด ฉันคิดว่านั่นเป็นเหตุผลที่อยู่เบื้องหลัง downvote อื่น ๆ
Michael Krelin - แฮกเกอร์

8
ฉันยังได้ลงคะแนนเนื่องจากคุณไม่สามารถรับประกันได้ว่าปลายทางที่ได้รับจะประกาศ & nbsp; หากคุณทำงานกับ xslt + html แล้วใช่นี่เป็นวิธีที่ทำได้แม้ว่าแฮ็ค แต่ถ้าคุณใช้ xslt เพื่อสร้าง xml อื่น ๆ มันจะระเบิดใส่คุณ
Doug

14

คุณอาจต้องการเพิ่มคำนิยามสำหรับเอนทิตีนี้ในตอนต้นของไฟล์ (ด้านล่างประกาศ xml):

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>

นอกจากนี้คุณสามารถเพิ่มเอนทิตีอื่น ๆ เช่น Ntilde, Aacute เป็นต้น


5

นอกเหนือจากคำตอบของ victor hugoแล้วยังมีความเป็นไปได้ที่จะได้รับการอ้างอิงตัวละครทุกตัวที่ถูกกฎหมายในไฟล์ XSLT ดังนี้:

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&amp; &nbsp; &ndash;</xsl:text>

นอกจากนี้ยังมีความแตกต่างบางอย่างในผลลัพธ์ของวิธีการนี้เมื่อเปรียบเทียบกับ<xsl:text disable-output-escaping="yes">วิธีหนึ่ง หลังจะผลิตตัวอักษรสตริงเช่น&nbsp;สำหรับทุกประเภทของการส่งออกแม้สำหรับ<xsl:output method="text">และสิ่งนี้อาจเกิดขึ้นจะแตกต่างจากสิ่งที่คุณอาจต้องการ ... ในทางกลับกันการกำหนดเอนทิตีสำหรับเท็มเพลต XSLT ผ่าน<!DOCTYPE ... <!ENTITY ...จะสร้างผลลัพธ์ที่สอดคล้องกับxsl:outputการตั้งค่าของคุณ

และเมื่อรวมการอ้างอิงอักขระทั้งหมดอาจเป็นการดีที่จะใช้ตัวแก้ไขเอนทิตีท้องถิ่นเพื่อป้องกันเอ็นจิ้น XSLT จากการดึงคำจำกัดความของอักขระเอนทิตีจากอินเทอร์เน็ต JAXP หรือผู้ใช้ Xalan-J ที่ชัดแจ้งอาจต้องการแพตช์สำหรับ Xalan-J เพื่อใช้ตัวแก้ไขปัญหาอย่างถูกต้อง ดูบล็อกXSLT, เอนทิตี, Java, Xalan ของฉัน ...สำหรับการดาวน์โหลดแพตช์และความคิดเห็น


1
โปรดทราบว่าเมื่อเร็ว ๆ นี้ W3 เริ่มบล็อกคำขอจำนวนมากไปยังลิงก์เหล่านั้นและลิงค์ที่คล้ายกันหากมาจากกระบวนการอัตโนมัติ วางไฟล์นั้นไว้ในเครื่องหรือบนเซิร์ฟเวอร์ของคุณและปรับ URL ให้สอดคล้องและคุณควรจะปรับ นอกจากนั้น +1 และโซลูชันที่ยอดเยี่ยมในการใช้เอนทิตีที่มีชื่อ HTML
Abel

หมายเหตุที่ดีและยังมีอีกเหตุผลที่จะมีสำเนาโลคัลของไฟล์ที่มีข้อกำหนดเอนทิตีเนื่องจากกระบวนการ XSLT อาจล้มเหลวหากการเชื่อมต่ออินเทอร์เน็ตไม่พร้อมใช้งาน ในโลก Java ไม่จำเป็นต้องแฮ็ค URL เนื่องจากเป็นไปได้ที่จะจัดการEntityResolverและApache XML Commons Resolverอาจเป็นตัวเลือกที่ดี แพลตฟอร์มการเขียนโปรแกรมอื่น ๆ มีแนวโน้มที่จะมีเทคนิคที่คล้ายกันเช่นกัน ...
Sergey Ushakov

ใช่ดังนั้นสำหรับการอ้างอิงสำหรับ dotnetters: วิธีนามธรรม ResolveEntityสำหรับองค์กรและXmlResolver โหลดทรัพยากรจากภายนอกซึ่งเป็นเทียบเท่า NET สำหรับวิธีการเหล่านี้
Abel

2

เมื่อคุณใช้สิ่งต่อไปนี้ (โดยไม่ต้องdisable-output-escaping!) คุณจะได้รับพื้นที่ที่ไม่ทำลาย:

<xsl:text>&#160;</xsl:text>


4
คุณไม่ต้องการdisable-output-escapingสิ่งนี้
Ian Roberts

2

สไตล์ชีตXSLTต้องเป็น XML ที่มีรูปแบบที่ถูกต้อง เนื่องจาก"&nbsp;"ไม่ใช่หนึ่งในเอนทิตี XML ที่กำหนดไว้ล่วงหน้าหนึ่งในห้าจึงไม่สามารถรวมไว้ในสไตล์ชีทได้โดยตรง ดังนั้นการกลับมาที่โซลูชันของคุณ"&#160;"จึงเป็นการทดแทนที่สมบูรณ์แบบที่"&nbsp;"คุณควรใช้

ตัวอย่าง:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

0

คุณยังสามารถใช้:

<xsl:value-of select="'&amp;nbsp'"/>

จำแอมป์หลังจาก & หรือคุณจะได้รับข้อความแสดงข้อผิดพลาด


สิ่งนี้จะเอาท์พุท&amp;nbsp;(สมมติว่าคุณตั้งใจจะใช้เครื่องหมายอัฒภาคเพื่ออยู่ที่นั่น) ซึ่งจะทำให้เหมือน&nbsp;ไม่ใช่ `` (nb-space)
Abel

0

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

<br/>

ฉันมีสถานการณ์ที่คล้ายกันและสิ่งนี้ดูเหมือนจะทำให้เซลล์ตารางสามารถแสดงผลได้
ริชาร์ดมัวร์

0

ลองใช้ดู

<xsl:text>&#160;</xsl:text>

แต่ขึ้นอยู่กับหน่วยประมวลผล XSLT ที่คุณใช้: ข้อมูลจำเพาะของ XSLT ไม่ต้องการตัวประมวลผล XSLT ในการแปลงเป็น " &nbsp;"


0

แม้ว่าคำตอบจะได้รับจาก @brabster และอื่น ๆ
ฉันคิดว่าโซลูชันที่นำมาใช้ซ้ำได้มากขึ้นจะเป็น:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.