Замените атрибут xmlns корневого узла, используя xslt - PullRequest
1 голос
/ 07 ноября 2011

У меня есть xml, как показано ниже

<rnp xmsns="v1">
  <ele1 line="1">
    <ele2></ele2>
  </ele1>
</rnp>

Я хочу изменить его на

<rnp xmsns="v2">
  <ele1 line="1">
    <ele2></ele2>
  </ele1>
</rnp>

, используя xslt 1.0.

Я использую ниже xsl.

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="v2">
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|*|node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="rnp">
        <rnp>
            <xsl:apply-templates select="*"/>
        </rnp>
    </xsl:template> 
</xsl:stylesheet>

Но этот xsl не копирует атрибуты, поэтому линейный атрибут не генерируется в выходных данных.

пример выходных данных

<?xml version="1.0" encoding="UTF-8"?><rnp xmlns="v2"><ele1>1
        <ele2/>
      </ele1></rnp>

Как изменить только текст xmlns attrbiuteиспользуя xslt?Есть ли другой способ изменить xmlns с помощью xslt?У меня есть только вариант xslt 1.0.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 ноября 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:param name="pNS" select="'v2'"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*[true()]">
  <xsl:element name="{local-name()}" namespace="{$pNS}">
       <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (исправлено, чтобы сделать его в пространстве имен "v1":

<rnp xmlns="v1">
  <ele1 line="1">
    <ele2></ele2>
  </ele1>
</rnp>

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

<rnp xmlns="v2">
   <ele1 line="1">
      <ele2/>
   </ele1>
</rnp>

Примечание :

  1. Требуемое новое пространство имен по умолчанию передается преобразованию в качестве внешнего параметра - таким образом, преобразование smae без каких-либо изменений может использоваться в каждом случае, когда пространство имен по умолчанию должно быть изменено.

  2. Это необычно выглядящее совпадение с шаблоном: <xsl:template match="*[true()]"> позволяет избежать сообщений о "восстанавливаемой ошибке неоднозначности" процессоров XSLT, если мы закодировали его как <xsl:template match="*">, и оно короче и элегантнее, чем указание приоритета.

0 голосов
/ 07 ноября 2011
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns="v2">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

Выход:

<rnp xmlns="v2">
    <ele1 line="1">
        <ele2 />
    </ele1>
</rnp>
...