2017-06-09 2 views
0

Ich mag xml wie diese erstellen:XSLT fehlende Namespaces in inneren Tags, die gleiche Namensraum-Deklaration als Root-Element haben

<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd"> 
    <rns:DocumentWrapper> 
     <ins:InnerDoc xmlns:ins="urn:inner-doc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:inner-doc inner-doc.xsd"> 
      <ins:Value>Some text</ins:Value> 
     </ins:InnerDoc> 
    </rns:DocumentWrapper> 
</rns:RootElement> 

Mit dieser Vorlage:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 

    <rns:RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:rns="urn:root-element" 
        xsi:schemaLocation="urn:root-element root-element.xsd"> 
     <rns:DocumentWrapper> 
      <ins:InnerDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:ins="urn:inner-doc" 
          xsi:schemaLocation="urn:inner-doc inner-doc.xsd"> 
       <ins:Value><xsl:value-of select="//*[local-name()='SomeNode']"/></ins:Value> 
      </ins:InnerDoc> 
     </rns:DocumentWrapper> 
    </rns:RootElement> 

</xsl:template> 

Aber statt Ergebnis, dass ich wollte, dass diese Vorlage gab mir ein bisschen anderes Ergebnis:

Wie Sie sehen können, fehlt dem InnerDoc-Element im Transformationsergebnis die Definition des Namensraums xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance", gibt es eine Möglichkeit, das Fehlen dieses Namensraums zu verhindern?

+1

Um die Antwort von Martin Honnen ein wenig zu erweitern, möchte ich darauf hinweisen, dass das Fehlen der doppelten 'ins' Namespace-Deklaration ** nichts bewirkt **. Jeder konforme XML-Prozessor erkennt, dass die Namespace-Deklaration "ins" für das Wurzelelement auch für dieses Element "ins: InnerDoc" gilt. Jeder konforme XSL-Prozessor, der die Position dieses "ins: InnerDoc" -Elements an eine andere Position verschiebt, an der die Deklaration für das Stammelement nicht gilt, fügt bei Bedarf auch die Namespace-Deklaration hinzu. –

+1

Ich weiß das, aber diese Anforderung geht von einem anderen System, und ich weiß nicht wirklich, ob sie meine Nachricht richtig ohne diesen Namespace erhalten würden. Wie auch immer, danke für diesen Kommentar! –

Antwort

1

Da die Namespace-Deklaration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" im Stammelement vorhanden ist, ist sie im Bereich für die untergeordneten und untergeordneten Elemente enthalten und muss nicht für das Element wiederholt werden. Ich kenne keine Möglichkeit, die Ausgabe von doppelten Namespace-Deklarationen mit XSLT zu erzwingen.

Einige andere APIs haben einen Weg, um sie zu unterdrücken, wie LINQ mit den OmitDuplicateNamespaces auf den SaveOptionshttps://msdn.microsoft.com/en-us/library/system.xml.linq.saveoptions(v=vs.110).aspx, in XML, aber diese Option wurde hinzugefügt eher doppelte Namespace-Deklarationen zu unterdrücken, wenn LINQ to XML-Bäume Serialisierung, nicht um sie zu erzwingen.

+0

Danke für Ihre Antwort! Ich nahm so etwas an, es scheint, dass ich auf andere Weise mit meinem Problem umgehen muss. –

Verwandte Themen