0

我在使用 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 标准。

感谢帮助!

4

2 回答 2

3

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

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

在这种特殊情况下

//complexType

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

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

//xsd:complexType
于 2012-07-11T12:50:44.847 回答
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 元素上,但这只是装饰性的。

于 2012-07-11T16:39:26.663 回答