В XPath имя без префикса всегда считается находящимся в «пространстве имен».
Таким образом, атрибут type
не находится в пространстве имен.
Просто используйте :
<xsl:template match="*[@type = 'xsd:string']">
...
</xsl:template>
Конечно, приведенный выше шаблон соответствия соответствует не только элементу identityID
, но и любому элементу , строковому значению которого type
атрибут 'xsd:string'
.
ОБНОВЛЕНИЕ : ОП "допустил в комментарии", что ему фактически необходимо соответствовать любому элементу, атрибут которого type
задает имя в схеме XMLnamespace.
Вот правильное решение (решение OP работает только для фиксированного префикса):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match=
"*[namespace::*
[name() = substring-before(../@type, ':')
and
. = 'http://www.w3.org/2001/XMLSchema'
]
]">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
это преобразование соответствует любому элементу, чей атрибут type
значение - это имя в пространстве имен схемы XML - независимо от используемого префикса !
При применении, например, к следующему документу XML :
<t xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<enitityID maxOccurs="0" minOccurs="0" type="xsd:string"/>
<somethingElse/>
<intIdID maxOccurs="0" minOccurs="0" type="xs:integer"/>
</t>
правильный результат (все такие совпадающие элементы, скопированные на выход)производится :
<enitityID xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
maxOccurs="0" minOccurs="0" type="xsd:string"/>
<intIdID xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
maxOccurs="0" minOccurs="0" type="xs:integer"/>