Создайте пространство имен и атрибут xmlns: xsi - PullRequest
10 голосов
/ 08 января 2009

Я хочу создать следующий элемент:

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">

Если я использую что-то вроде этого:

<xsl:element name="excercises">
<xsl:attribute name="xmlns:xsi" namespace="http://www.w3.org/2001/XMLSchema-instance"/>

Затем создается нечто подобное:

<excercises xp_0:xsi="" xmlns:xp_0="http://www.w3.org/2001/XMLSchema-instance">

Что не похоже на то, что я хочу ...

Ответы [ 3 ]

8 голосов
/ 08 января 2009

Попробуйте вместо этого:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="xml">
        <xsl:element name="exercises">
            <xsl:attribute name="xsi:noNamespaceSchemaLocation">mySchema.xsd</xsl:attribute>
            some value
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Ключевой задачей является объявление пространства имен xsi в объявлении.

Я только что создал шаблон, чтобы проверить.

3 голосов
/ 08 января 2009

Вот как это можно сделать :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 exclude-result-prefixes="xsi">
    <xsl:output omit-xml-declaration="yes"/>
    <!--                                   -->
    <xsl:template match="/">
      <exercises  xsi:noNamespaceSchemaLocation="mySchema.xsd"/>
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любому исходному XML-документу (не используется), получается желаемый результат:

<exercises xsi:noNamespaceSchemaLocation="mySchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

Нет необходимости использовать <xsl:attribute> в вашем случае , однако при необходимости его можно использовать без проблем:

    <xsl:attribute name="xsi:noNamespaceSchemaLocation">
      <xsl:value-of select="'mySchema.xsd'"/>
    </xsl:attribute>

Обратите внимание, что хорошей практикой является просто определить необходимые пространства имен в элементе <xsl:stylesheet> , чтобы их можно было легко (повторно) использовать везде, где они необходимы. Это особенно полезно, если данное пространство имен потребуется для нескольких сгенерированных элементов или атрибутов.

В этом случае также полезно указывать все такие префиксы в значении атрибута exclude-result-prefixes , чтобы пространства имен не распространялись автоматически на все литеральные элементы результата .

1 голос
/ 08 января 2009

Вы можете просто использовать: -

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">

Непосредственно в вашем XSL, который будет работать, вам действительно нужен только xsl: element, если вы не можете жестко кодировать имя тега. Точно так же с атрибутами вы можете добавлять их напрямую, если вам не нужно делать условия.

...