Sử dụng copy-of with document () để thêm SVG vào đầu ra XHTML


113

Trong khi xử lý XML của mình, tôi đang cố gắng sao chép hreftrực tiếp tệp SVG được tham chiếu từ một thuộc tính vào HTML đầu ra của mình với dòng sau:

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

Điều copy-namespacesnày không cần thiết vì dù sao giá trị mặc định là "có", nhưng tôi đã thêm nó để ngăn câu hỏi về việc tôi đã thử hay chưa.

Các tệp được sao chép vào HTML, nhưng bất kỳ phần tử nào có không gian tên đều bị xóa. Ví dụ: một tệp trông giống như thế này trước khi được sao chép:

  <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

Sau đó trông như thế này:

  <_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

Không gian tên xlink bị thiếu trên hrefgiá trị của phần tử hình ảnh đặc biệt có vấn đề.

Bất kỳ suy nghĩ nào về cách tôi có thể làm điều này theo cách khác để đọc trong tệp SVG mà không cần bất kỳ giải thích nào?

Tôi đã tìm thấy một giải pháp "hoạt động", nhưng đó là một cuộc tấn công và tôi muốn một cái gì đó thanh lịch hơn:

<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
Biểu định kiểu của bạn có tất cả các không gian tên được khai báo trong thẻ gốc không?
PhillyNJ

6
Không gian tên SVG có được định hình tốt không? Phân đoạn bạn hiển thị không bao gồm một ràng buộc cho tiền tố 'xlink'.
CM Sperberg-McQueen

3
Bạn sử dụng bộ xử lý XSLT 2.0 nào? Bạn có thể đăng các mẫu tối thiểu nhưng đầy đủ cho phép chúng tôi tái tạo vấn đề không? Bạn sử dụng phương pháp xuất XSLT nào?
Martin Honnen,

15
Ngay từ cái nhìn đầu tiên, nó giống như một lỗi trong bộ xử lý XSLT của bạn. Nhưng sự nghi ngờ của tôi dấy lên khi bạn nói rằng bạn đang sao chép nó vào một tài liệu HTML. Nếu bạn đang thêm nó vào HTML DOM, thì HTML DOM không thân thiện với không gian tên, vì vậy tất cả các loại điều có thể xảy ra. Tuy nhiên, tiêu đề của bạn cho biết "xHTML". Vì vậy, tôi nghĩ chúng ta cần biết thêm: bạn đang sử dụng bộ xử lý XSLT nào và bạn đang chạy nó như thế nào?
Michael Kay,

1
Bạn có phiền chia sẻ mã và cách triển khai của mình không? Tôi tò mò ít nhất là tái tạo điều này.
Gerard van Helden

Câu trả lời:


1

Tôi nghĩ bạn đã hiểu lý do cho hoạt động XSLT này:

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

điều này giữ nguyên không gian tên bị xáo trộn của bạn cho đến khi đầu ra được tạo, khi quá trình chuyển đổi không gian tên được thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.