2009-07-09 19 views
2

Was benötige ich, um dies zu tun:XSLT: Drehen <element></element> in <element />

<xsl:template match="xs:simpleType"> 
     <xsl:copy> 
     <xsl:copy-of select="node()[not(self::xs:annotation or self::xs:restriction)]|@*"/> 
     </xsl:copy> 
    </xsl:template> 

Derzeit dies stellt sich heraus:

<xs:simpleType xmlns:core="urn:org:pesc:core:CoreMain:v1.4.0" name="SINIDType"> 


</xs:simpleType> 

Ich würde es vorziehen aussehen:

<xs:simpleType name="SINIDType" /> 

Antwort

0

Der Serialisierer ist dafür verantwortlich, ob ein leeres Element als <abc></abc> emittiert wird, oder <abc/>, und sie sind genau gleichwertig. Einige Serialisierer geben keine Option und werden immer das eine oder das andere erzeugen.

Aber es könnte sein, dass Sie Leerzeichen zwischen ihnen emittieren; In diesem Fall müssen Sie den Wert xsl:copy in einen anderen Wert ändern, der den unbedeutenden Leerraum nicht enthält, z. B. indem Sie Ihrem Prädikat or text() = '' hinzufügen.

Soweit die xmlns:core Namespace-Deklaration zu beseitigen, das hängt von Ihrem Kontext. Es wird erzeugt wird immer, wenn es ein Element, das es innerhalb Ihrer Art erfordert, oder wenn Sie XSLT verwenden und nicht den Namespace mit dem @exclude-result-prefixes Attribute auf dem <xsl:stylesheet> Wurzelelement ausgeschlossen. Und selbst dann, abhängig von Ihrer Prozessorumgebung, kann der Serialisierer "entscheiden", dass er diesen Namespaceausgang unnötigerweise wünscht, da er in der Eingabe enthalten war.

Außerdem ist es irgendwie merkwürdig <xsl:copy> ... <xsl:copy-of .../> ... </xsl:copy> zu sehen. Sie sollten die copy-of innerhalb der copy s nicht wirklich wickeln. Mach es einfach copy-of.

3

mit diesen leeren Zeilen in es, es sieht aus wie Ihre select-Anweisung (richtig) ist Ihre Leerzeichen Knoten sowie Ihre Elemente auswählen. versuchen

select="*[not(self::xs:annotation or self::xs:restriction)]|@*" 

verwendet, die nur Elementknoten übereinstimmen, nicht Textknoten.

Verwandte Themen