使用不带名称空间的xsl处理xsd

时间:2012-07-11 12:37:16

标签: xml xslt xsd schema

我在使用xsl处理xsd时遇到问题。我的xsd文件开始了:

<schema targetNamespace="http://www.bleble.com"
xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="blabla">
...

所以xsl没有可以识别标签的命名空间。

我无法修改xsd文件,因为有很多代码和大量文件,因此只有可能的方法是创建一个合适的xsl转换文件。

我一直在尝试添加命名空间:

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

不将其添加到标签:

<complexType name="blabla">

但它对xml标准无效。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

这是XPath和XSLT中最常见的常见问题 - 在XPath中搜索“默认命名空间”,你会发现很多很好的解释。

快速回答是,要选择默认名称空间(其namespace-uri不是空字符串)中具有无前缀名称的元素,您需要在XSLT代码中将前缀绑定到名称空间并引用带有前缀的任何未加前缀的元素名称。

在这种特殊情况下

//complexType

什么都不做,因为XPath处理器正在寻找一个名为complexType的元素,它位于“无命名空间”中,但文档中的所有元素都在"http://www.w3.org/2001/XMLSchema"命名空间中。

您已将前缀xsd绑定到源XML文档的默认命名空间 - 然后使用:

//xsd:complexType

答案 1 :(得分:1)

你很困惑!

你说:“因此没有名称空间可以通过xsl来识别标签”。但是有一个名称空间 - 名称空间是http://www.w3.org/2001/XMLSchema。没有前缀,但前缀与XSLT无关;为了编写XSLT处理代码,您唯一需要知道的是命名空间URI。例如,如果要匹配complexType元素,则需要编写等效的

<xsl:template match="ajkt:complexType" xmlns:ajkt="http://www.w3.org/2001/XMLSchema"/>

当然,您通常会使用比ajkt(可能是xs或xsd)更容易识别的前缀,并且通常会将声明放在xsl:stylesheet元素上,但这只是装饰性的。