Використання копіювання документа () для додавання SVG до виходу XHTML


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 CM Sperberg-McQueen

3
Який процесор XSLT 2.0 ви використовуєте? Чи можете ви розмістити мінімальні, але повні зразки, що дозволяють нам відтворити проблему? Який метод виведення XSLT ви використовуєте?
Мартін Гоннен

15
На перший погляд це схоже на помилку у вашому процесорі XSLT. Але мої підозри виникають, коли ти кажеш, що ти копіюєш його в документ HTML. Якщо ви додаєте його до HTML DOM, то HTML DOM не є зручним для простору імен, тому можуть статися всілякі речі. Однак у вашому заголовку написано "xHTML". Тож я думаю, що нам потрібно знати більше: який процесор XSLT ви використовуєте та як ним керуєте?
Майкл Кей

1
Ви б не хотіли поділитися кодом та реалізацією? Мені цікаво хоча б це відтворити.
Джерард ван Хелден

Відповіді:


1

Думаю, ви зрозуміли причину цієї операції XSLT:

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

який залишає ваші розмежовані простори імен недоторканими до тих пір, поки не буде створено вихід, коли буде здійснено перетворення простору імен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.