ใช้ copy-of with document () เพื่อเพิ่ม SVGs ไปยัง XHTML output


113

ขณะประมวลผล XML ของฉันฉันกำลังพยายามคัดลอกไฟล์ SVG ที่อ้างอิงจากhrefแอตทริบิวต์ลงใน HTML เอาต์พุตโดยตรงด้วยบรรทัดต่อไปนี้:

 <xsl:copy-of copy-namespaces="yes" select="document(@href)"/>

copy-namespacesไม่ควรจะเป็นสิ่งที่จำเป็นตั้งแต่ค่าเริ่มต้นคือ "ใช่" แล้ว แต่ฉันได้เพิ่มเพื่อป้องกันไม่ให้คำถามเกี่ยวกับหรือไม่ฉันได้พยายามมัน

ไฟล์จะถูกคัดลอกไปยัง HTML แต่องค์ประกอบเนมสเปซจะถูกซ่อนไว้ ตัวอย่างเช่นไฟล์ที่มีลักษณะเช่นนี้ก่อนที่จะคัดลอก:

  <rdf:RDF>
      <cc:Work rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
        <dc:title/>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g transform="translate(-519.21143,-667.79077)" id="layer1">
    <image xlink:href="data:image/png;base64

หลังจากนั้นจะมีลักษณะดังนี้:

  <_0:RDF xmlns:_0="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <_0:Work xmlns:_0="http://creativecommons.org/ns#" about="">
        <_0:format xmlns:_0="http://purl.org/dc/elements/1.1/">image/svg+xml</_0:format>
        <_0:type xmlns:_0="http://purl.org/dc/elements/1.1/" resource="http://purl.org/dc/dcmitype/StillImage"/>
        <_0:title xmlns:_0="http://purl.org/dc/elements/1.1/"/>
      </_0:Work>
    </_0:RDF>
  </metadata>
  <g id="layer1" transform="translate(-519.21143,-667.79077)">
    <image href="data:image/png;base64

เนมสเปซ xlink ที่หายไปในhrefค่าขององค์ประกอบรูปภาพเป็นปัญหาอย่างยิ่ง

มีความคิดเห็นอย่างไรกับการอ่านไฟล์ SVG โดยไม่มีการตีความ

ฉันพบวิธีแก้ปัญหาหนึ่งที่ "ใช้ได้ผล" แต่เป็นการแฮ็กและฉันต้องการสิ่งที่หรูหรากว่านี้:

<xsl:template name="topic-image-svg">
    <!-- Generate tags to embed SWFs -->
    <xsl:element name="div">
      <xsl:if test="@width">
        <xsl:attribute name="width">
          <xsl:value-of select="@width"/>
        </xsl:attribute>
      </xsl:if>
      <xsl:if test="@height">
        <xsl:attribute name="height">
          <xsl:value-of select="@height"/>
        </xsl:attribute>
      </xsl:if>     
        <xsl:apply-templates select="document(@href)" mode="svg"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="*" mode="svg">
    <xsl:copy copy-namespaces="yes">
      <xsl:for-each select="@*">
        <xsl:choose>
          <xsl:when test="self::node()[name() = 'xlink:href']">
            <xsl:attribute name="xlink:href"><xsl:value-of select="."></xsl:value-of></xsl:attribute>
          </xsl:when>
          <xsl:otherwise>
            <xsl:copy></xsl:copy>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
     <xsl:apply-templates mode="svg"></xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

5
สไตล์ชีตของคุณมีเนมสเปซทั้งหมดที่ประกาศในรูทแท็กหรือไม่
PhillyNJ

6
เนมสเปซ SVG มีรูปแบบที่ดีหรือไม่ ส่วนที่คุณแสดงไม่มีการผูกสำหรับคำนำหน้า 'xlink'
CM Sperberg-McQueen

3
คุณใช้โปรเซสเซอร์ XSLT 2.0 ตัวใด คุณสามารถโพสต์ตัวอย่างน้อยที่สุด แต่สมบูรณ์เพื่อให้เราสามารถสร้างปัญหาซ้ำได้หรือไม่ คุณใช้วิธีเอาต์พุต XSLT แบบใด
Martin Honnen

15
ในตอนแรกดูเหมือนว่ามีข้อบกพร่องในโปรเซสเซอร์ XSLT ของคุณ แต่ความสงสัยของฉันเกิดขึ้นเมื่อคุณบอกว่าคุณกำลังคัดลอกไปยังเอกสาร HTML หากคุณกำลังเพิ่มลงใน HTML DOM แสดงว่า HTML DOM ไม่เหมาะกับเนมสเปซดังนั้นสิ่งต่างๆอาจเกิดขึ้นได้ อย่างไรก็ตามชื่อของคุณระบุว่า "xHTML" ดังนั้นฉันคิดว่าเราจำเป็นต้องรู้เพิ่มเติม: คุณใช้โปรเซสเซอร์ XSLT ตัวใดและคุณใช้งานอย่างไร
Michael Kay

1
คุณช่วยแบ่งปันรหัสและการใช้งานของคุณได้ไหม อย่างน้อยฉันก็อยากรู้อยากเห็นที่จะทำซ้ำสิ่งนี้
Gerard van Helden

คำตอบ:


1

ฉันคิดว่าคุณได้รับเหตุผลของการดำเนินการ XSLT นี้:

http://www.w3schools.com/xsl/el_namespace-alias.asp

ซึ่งจะทำให้เนมสเปซของคุณไม่เสียหายจนกว่าจะมีการสร้างเอาต์พุตเมื่อการแปลงเนมสเปซเสร็จสิ้น

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