Використання копіювання документа () для додавання 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.