Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > как создать аттрибут xmlns: с помошью xslt


Автор: lankin 28.10.2009, 11:53
Нужно создать вот такую строку:
Код

<rss version="2.0" xmlns:myNS="http://.......">


где myNS - мой нэмспэйс, который я буду использовать внутри RSS, расширяя его.

щас пока вот что есть:
Код

<xsl:stylesheet version="1.0" xmlns:myNS="http://.......">
<xsl:output method="xml" encoding="utf-8" version="1.0" standalone="yes"/>
<xsl:template match="/">
    <xsl:element name="rss">
      <xsl:attribute name="version">2.0</xsl:attribute>
.
        <xsl:element name="myNS:ModificationDatetime">
        <xsl:value-of select="ModificationDatetimeString"/>
    </xsl:element>
.
.
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>


Результат:
Код

<rss version="2.0">
<channel>
  <title/>
  <link/>
  <description/>
<item>
  <title/>
  <link/>
  <description/>
  <myNS:ModificationDatetime xmlns:myNS="http://.......">04.08.2009 12:16</myNS:ModificationDatetime>
</item>
</rss>


Как видите, щас нэмспэйс прописывается каждый раз внутри элемента myNS:, а мне нужно, чтобы он был прописан один раз как атрибут корневого элемента RSS:
<rss version="2.0" xmlns:myNS:"http://.......">
Как?

Автор: diadiavova 28.10.2009, 19:46
Это управляется атрибутом exclude-result-prefixes в корневом элементе XSLT. Включённые в его значение прификсы ведут себя так как ты описываешь, а те, которых там нет декларируются в корневом элементе(как тебе надо). Дефолтное поведение видмо от XSLT-процессора зависит. Попробуй объявить этот атрибут с пустым значением.

Автор: NiТR0 29.10.2010, 14:44
Не знаю как у lankinа, а у меня не сработало.

Позволю себе немного расширить тему.
Тема избитая, но есть один важный ньюанс: в исходном XML нет namespaces.
Их не надо их вытаскивать из исходного XML, только создать новые namespaces в выходном XML.

Помогите пожалуйста решить задачу. Второй день мучаюсь.

Исходный XML
Note: Обратите внимание, что никаких namespaces нет
Код

<?xml version="1.0" encoding="utf-8"?>
<deploymentDescriptor>
...    
</deploymentDescriptor>


На выходе должен быть такой XML
Код

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
</project>



XSLT
Код

<xsl:stylesheet version="2.0"    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:element name="project">
            <!-- Тут начинаются проблемы -->
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>


В документации сказано:

Example: Namespaces are not Attributes

It is not an error to write:

<xsl:attribute name="xmlns:xsl" namespace="file://some.namespace">
    http://www.w3.org/1999/XSL/Transform
</xsl:attribute>

However, this will not result in the namespace declaration xmlns:xsl="http://www.w3.org/1999/XSL/Transform" being output. Instead, it will produce an attribute node with local name xsl, and with a system-allocated namespace prefix mapped to the namespace URI file://some.namespace. This is because the namespace fixup process is not allowed to use xmlns as the name of a namespace node.


Но не сказано как добавить namespaces типа xmlns:xsi и xsi:schemaLocation.  smile 

Автор: diadiavova 29.10.2010, 15:45
NiТR0, декларации пространств имен добавляются автоматически, если в документе присутствуют элементы, относящиеся к этим пространствам. Тебе надо объявить эти пространства в XSLT-документе и формировать нужные элементы придерживаясь тех префиксов, которые объявлены в XSLT. Остальное - задача хсл-процессора.

Автор: NiТR0 29.10.2010, 15:49
Да, вы правы.

Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://maven.apache.org/POM/4.0.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>

  <xsl:template match="/">
    <xsl:element name="project" >
      <xsl:attribute name="xsi:schemaLocation">http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd</xsl:attribute>
    </xsl:element>

    <!--
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"/>
    -->
  </xsl:template>
</xsl:stylesheet>


Большое спасибо

Автор: magelan 29.10.2010, 17:20
NiТR0,
будет время погуглите:
Код

<xsl:namespace-alias />


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)