Pergunta

Eu quero criar o elemento seguinte:

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

Se eu usar algo como isto:

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

Em seguida, ele cria soemthing como esta:

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

Que não olha similar ao que eu quero ...

Foi útil?

Solução

Tente o seguinte em vez disso:

<?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>

A principal preocupação é declarar o namespace xsi na declaração.

Acabei de fazer o jogo modelo no apenas para teste.

Outras dicas

Aqui está como isso pode ser feito :

<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>

Quando esta transformação é aplicada em qualquer documento XML de origem (não utilizado), o resultado queria é produzido:

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

Não é necessário usar <xsl:attribute> no seu caso , no entanto, se necessário, ele pode ser usado sem qualquer problema:

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

Nota Do que é uma boa prática para simplesmente definir os espaços de nomes necessários no elemento <xsl:stylesheet> de modo que eles podem facilmente ser (re) utilizado em todos os lugares que eles são necessários. Isto é especialmente útil, se um determinado namespace será necessário em mais de um elemento ou atributo gerado.

Neste caso, também é bom para especificar todos esses prefixos no valor do exclude-result-prefixes atributo para que os espaços de nomes não serão propagadas automaticamente em todos os elementos de resultado literal.

Você poderia simplesmente usar: -

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

diretamente em seu XSL, que iria trabalhar, você só precisa realmente xsl: elemento se não pode duro código o nome da marca. Da mesma forma com atributos que você pode adicioná-los diretamente a menos que você precisa para fazer condicional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top