Używanie copy-of z document () do dodawania plików SVG do wyjścia XHTML

113

Podczas przetwarzania mojego kodu XML próbuję skopiować plik SVG, do którego odwołuje się hrefatrybut, bezpośrednio do mojego wyjściowego kodu HTML za pomocą następującego wiersza:

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

Nie copy-namespacespowinno być konieczne, ponieważ wartość domyślna i tak to „tak”, ale dodałem ją, aby uniknąć pytań o to, czy próbowałem.

Pliki są kopiowane do kodu HTML, ale wszystkie elementy w przestrzeni nazw są otoczone. Na przykład plik, który wygląda tak przed skopiowaniem:

  <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

Wygląda później tak:

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

Brak przestrzeni nazw xlink w hrefwartości elementu obrazu jest szczególnie problematyczny.

Jakieś przemyślenia na temat tego, jak mogę to zrobić inaczej, aby przeczytać plik SVG bez żadnej interpretacji?

Znalazłem jedno rozwiązanie, które "działa", ale to hack i chciałbym coś bardziej eleganckiego:

<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>
jrhooker
źródło
5
Czy Twój arkusz stylów zawiera wszystkie przestrzenie nazw zadeklarowane w znaczniku głównym?
PhillyNJ
6
Czy przestrzeń nazw SVG jest dobrze sformułowana? Pokazany fragment nie zawiera powiązania z przedrostkiem „xlink”.
CM Sperberg-McQueen,
3
Którego procesora XSLT 2.0 używasz? Czy możesz opublikować minimalne, ale kompletne próbki, które pozwolą nam odtworzyć problem? Jakiej metody wyjściowej XSLT używasz?
Martin Honnen
15
Na pierwszy rzut oka wygląda to na błąd w twoim procesorze XSLT. Ale moje podejrzenia budzą się, kiedy mówisz, że kopiujesz to do dokumentu HTML. Jeśli dodajesz go do HTML DOM, wtedy HTML DOM nie jest przyjazny dla przestrzeni nazw, więc może się zdarzyć wiele rzeczy. Jednak w tytule jest napisane „xHTML”. Myślę więc, że musimy wiedzieć więcej: jakiego procesora XSLT używasz i jak go używasz?
Michael Kay
1
Czy mógłbyś podzielić się swoim kodem i implementacją? Jestem ciekawy przynajmniej, że mogę to odtworzyć.
Gerard van Helden

Odpowiedzi:

1

Myślę, że trafiłeś na powód tej operacji XSLT:

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

co pozostawia zniekształcone przestrzenie nazw nienaruszone do momentu wygenerowania danych wyjściowych, po zakończeniu transformacji przestrzeni nazw.

Najstarszy facet od oprogramowania
źródło