2009-01-08 10 views
10

Chcę utworzyć następujący element:Tworzenie xmlns: nazw XSI i przypisują

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

Gdybym użyć czegoś takiego:

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

Następnie tworzy czegos potrzebowalem tak:

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

Który nie wygląda podobnie do tego, czego chcę ...

+0

Którego parsera XSLT używasz? – Kev

Odpowiedz

8

Wypróbuj następujące zamiast:

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

Kluczowym problemem jest stwierdzenie nazw XSi w deklaracji.

Właśnie wymyśliłem dopasowanie do szablonu tylko do przetestowania.

+0

Ponieważ alias msxsl nie jest używany, może być lepiej, gdybyś go po prostu usunął, to sprawiłoby, że przykład byłby wyraźniejszy – AnthonyWJones

+0

tak ... Właśnie wyczyściłem MS Cruft – Kev

+0

thx i dałem twojemu kotu uściskany – eddy147

2

Oto jak można to zrobić:

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

Gdy ta transformacja jest stosowana na dowolnym dokumencie źródło XML (nie używany), przy czym poszukiwanych wynik jest produkowany:

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

Nie jest konieczne stosowanie <xsl:attribute> w twoim przypadku, jednak w razie potrzeby można z niego bez problemu korzystać:

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

Należy pamiętać, że jest to dobra praktyka, aby po prostu określić niezbędne nazw w elemencie tak <xsl:stylesheet> że mogą łatwo być (re) stosowany wszędzie tam, gdzie są potrzebne. Jest to szczególnie przydatne, jeśli dany obszar nazw będzie potrzebny na więcej niż jednym wygenerowanym elemencie lub atrybucie.

W tym przypadku jest to również dobre określić wszystkie takie przedrostki wartości atrybutuexclude-result-prefixes tak, że przestrzenie nazw nie zostaną automatycznie propagowane na wszystkich dosłownych elementów wynikowych.

+0

Dlaczego tłumiłeś prefiks wyniku xsi? – AnthonyWJones

+0

@AnthonyWJones: Jeśli nie dodasz prefiksu "xsi" do listy wartości atrybutu "wyklucz-wynik-prefiksy", każdy literalny element wyniku będzie wyprowadzany jako posiadający ten węzeł przestrzeni nazw. Jest to wyłącznym celem e.r.p attr. Przeczytaj tutaj: http://www.w3.org/TR/xslt#literal-result-element –

1

Można po prostu użyć: -

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

bezpośrednio w XSL, że będzie działać, tylko naprawdę trzeba xsl: element, jeśli nie może ciężko kod nazwa znacznika. Podobnie z atrybutami możesz dodawać je bezpośrednio, chyba że musisz wprowadzić warunkowe.

Powiązane problemy