如何为type属性位于xsd:namespace中的元素指定匹配项?例如:
<enitityID maxOccurs="0" minOccurs="0" type="xsd:string"/>
我试过
<xsl:template match="*[namespace-uri(@type)= 'http://www.w3.org/2001/XMLSchema']">
...
</xsl:template>
但它似乎不起作用。感谢。
答案 0 :(得分:1)
在模式感知的XSLT 2.0转换中,如果在类型为xs:QName的模式中声明了type属性,那么您需要*[namespace-uri-from-QName(@type) = 'http://www.w3.org/2001/XMLSchema']
答案 1 :(得分:0)
在XPath中,未加前缀的属性名称始终被视为“无命名空间”。
因此,type
属性没有名称空间。
只需使用:
<xsl:template match="*[@type = 'xsd:string']">
...
</xsl:template>
当然,上述匹配模式不仅匹配identityID
元素,还匹配任何元素,其type
属性为'xsd:string'
的字符串值。< / p>
更新:OP已“在评论中承认”他实际上需要匹配其type
属性在XML Schema名称空间中指定名称的任何元素。
这是一个正确的解决方案(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"/>
答案 2 :(得分:0)
该属性值中的xsd:
不是名称空间声明;它只是属性值的一部分;你只需要@type = 'xsd:string'
来匹配它。
编辑:根据评论,为匹配任何以xsd:
开头的内容,您只需使用substring-before(@type,':') = 'xsd'
或substring(@type,1,4) = 'xsd:'