XSLT копирует атрибуты элементов, если атрибут не находится в данном пространстве имен - PullRequest
1 голос
/ 08 марта 2011

Это элементы SVG, и поставщик документов SVG добавил все виды расширений, которые мы не можем использовать и не хотим.Поэтому я хотел бы удалить эти расширенные атрибуты.

Я в основном использую преобразование идентичности.Я хочу, чтобы этот элемент:

<text id="1" 
      i:knockout="Off" 
      i:objectType="pointText" 
      style="font-size:16;"
     >Hi</text>

скопировал как

<text id="1" style="font-size:16;">Hi</text>

Любая помощь приветствуется.

Редактировать

К сожалениюПример, который я выбрал выше, не был реальным.Это:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" 
     i:viewOrigin="-39.4106 906.6265" i:rulerOrigin="0 0" i:pageBounds="0 840 592 0" >
   <g i:extraneous="self">
   </g>
</svg>

, и я хочу:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" 
     >
   <g>
   </g>
</svg>

1 Ответ

0 голосов
/ 09 марта 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:copy-of select=
    "namespace::*[not(.='i:i')]"/>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="@*[namespace-uri()='i:i']"/>

 <xsl:template match="@*">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<text id="1" xmlns:i="i:i"
  i:knockout="Off"
  i:objectType="pointText"
  style="font-size:16;">Hi</text>

создает искомый, правильный результат:

<text id="1" style="font-size:16;">Hi</text>

ОБНОВЛЕНИЕ : ОП теперь указал точное пространство имен, к которому привязан префикс "i".

В этомЕсли простая замена "i:i" на http://ns.adobe.com/AdobeIllustrator/10.0/ дает нам новое решение:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="pUnwantedNS" select="'http://ns.adobe.com/AdobeIllustrator/10.0/'"/>

    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:copy-of select="namespace::*[not(.=$pUnwantedNS)]"/>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match=
    "@*[namespace-uri()='http://ns.adobe.com/AdobeIllustrator/10.0/']"/>
</xsl:stylesheet>

и при применении к недавно предоставленному XML-документу:

<svg xmlns="http://www.w3.org/2000/svg"
  xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
  i:viewOrigin="-39.4106 906.6265"
  i:rulerOrigin="0 0"
  i:pageBounds="0 840 592 0" >
    <g i:extraneous="self"></g>
</svg>

снова выдается желаемый, правильный результат :

<svg xmlns="http://www.w3.org/2000/svg">
  <g />
</svg>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...