я хочу добавить атрибут "xmlns" в XML-файл, используя xslt - PullRequest
1 голос
/ 27 июля 2010

Я хочу следующий вывод XML-файла:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
- <INTERFACE>
  <NAME>SAFER</NAME> 
  <VERSION>04.02</VERSION> 
  </INTERFACE>

для этого у меня есть следующий файл xslt:

<xsl:template match="T0020" >
    <xsl:copy>
    <xsl:attribute name="xsi:schemaLocation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd </xsl:attribute>

  //some code here...............//

 <xsl:copy>

поэтому я добавляю атрибут xmlns = "http://www.safersys.org/namespaces/T0020V1" в тег <T0020> ??

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

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

<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:variable name="vDefaultNS"
  select="'http://www.safersys.org/namespaces/T0020V1'"/>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{$vDefaultNS}">
   <xsl:copy-of select="namespace::* | @*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<T0020 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"
>
 <INTERFACE>
  <NAME>SAFER</NAME>
  <VERSION>04.02</VERSION>
 </INTERFACE>
</T0020>

дает желаемый результат :

<T0020 xmlns="http://www.safersys.org/namespaces/T0020V1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd">
   <INTERFACE>
      <NAME>SAFER</NAME>
      <VERSION>04.02</VERSION>
   </INTERFACE>
</T0020>

Обратите внимание , что xmlns не является атрибутом, но обозначает объявление пространства имен.

1 голос
/ 27 июля 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="T0020">
        <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1">
            <xsl:attribute name="xsi:schemaLocation">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd</xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<T0020>
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
</T0020>

Выход:

<T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
</T0020>

Примечание : узлом пространства имен являютсяне атрибуты узлов.Если вы хотите, чтобы элементы без пространства имен выводились в некотором пространстве имен, вам нужен xsl:element/@namespace.

...