\begingroup\makeatletter
\gdef\@xlst@lst@inouter#1{\ifnum\lst@mode=\lst@Pmode\relax \xlstGet{keywordA}{#1}\else#1\fi}
\lstdefinelanguage{lXml}{
number suffixes={},
morestring=[s]{"}{"},
morecomment=[s]{<?}{?>},
morecomment=[s]{!--}{--},
moredelim=[is][{}]{|plain|}{|plain|},
alsoletter={:\#!-},
alsoother={<>},
add to literate={/}{{\@xlst@lst@inouter{/}}}1 {<}{{\@xlst@lst@inouter{<}}}1 {>}{{\@xlst@lst@inouter{>}}}1,
escapeinside={!*}{*!},
showstringspaces=true,  %Damit es keine Verwechslungen gibt
morekeywords = {!DOCTYPE,DOCTYPE,!ELEMENT,ELEMENT,!ATTLIST,ATTLIST},
morekeywords = [2]{xml},
morekeywords = [3]{SYSTEM,PUBLIC,EMPTY,\#PCDATA,\#IMPLIED,\#REQUIRED,\#FIXED,ANY},
morekeywords = [4]{CDATA,ID,ENTITY,IDREF,IDREFS,NOTATION,xs:element,xs:list,xs:namespace,xs:attribute,xs:simpleType,xs:minInclusive,xs:maxInclusive,xs:restriction,xs:enumeration,xs:union,xs:sequence,xs:complexType,xmlns,xmlns:xs,xmlns:xsi,xsi:schemaLocation,xs:schema,xs:integer,last()},% + xpath
morekeywords = [6]{name,maxOccurs,minOccurs,version,encoding,targetNamespace,ref,type,memberTypes,itemType,base,value,default,transaction-type,version},
morestring=[s]'',
}
\endgroup
\RegisterLanguage{xml}{lXml}