如何匹配类型命名空间为xsd:string的元素

时间:2012-02-29 14:47:12

标签: xslt

如何为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>  

但它似乎不起作用。感谢。

3 个答案:

答案 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:'