document ()와 함께 copy-of를 사용하여 SVG를 XHTML 출력에 추가


113

내 XML을 처리하는 동안 href속성 에서 참조 된 SVG 파일을 다음 줄을 사용하여 출력 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

href이미지 요소 의 값 에서 누락 된 xlink 네임 스페이스 는 특히 문제가됩니다.

해석없이 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 2013-08-30

6
SVG 네임 스페이스가 잘 구성되어 있습니까? 표시되는 조각에는 접두사 'xlink'에 대한 바인딩이 포함되어 있지 않습니다.
CM Sperberg-McQueen 2013

3
어떤 XSLT 2.0 프로세서를 사용하십니까? 문제를 재현 할 수 있도록 최소한의 완전한 샘플을 게시 할 수 있습니까? 어떤 XSLT 출력 방법을 사용하십니까?
Martin Honnen 2013-08-31

15
처음에는 XSLT 프로세서의 버그처럼 보입니다. 그러나 당신이 그것을 HTML 문서에 복사한다고 말하면 내 의심이 일어납니다. HTML DOM에 추가하는 경우 HTML DOM은 네임 스페이스 친화적이지 않으므로 모든 종류의 일이 발생할 수 있습니다. 그러나 제목은 "xHTML"입니다. 그래서 우리는 더 많은 것을 알아야한다고 생각합니다 : 어떤 XSLT 프로세서를 사용하고 있으며 어떻게 실행하고 있습니까?
Michael Kay

1
코드와 구현을 공유 하시겠습니까? 적어도 이것을 재현하고 싶습니다.
Gerard van Helden 2015 년

답변:


1

이 XSLT 작업에 대한 이유를 알고 있다고 생각합니다.

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

이는 네임 스페이스 변환이 완료 될 때 출력이 생성 될 때까지 망가진 네임 스페이스를 그대로 둡니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.