2012-07-11 62 views
0

我使用xsl处理xsd时遇到问题。我的XSD文件开始:使用不带名称空间的xsl处理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标准有效。

感谢您的帮助!

+0

你需要更清楚你尝试过的东西。你的意思是你添加了xmlns:xsd命名空间前缀声明*到你的XSL样式表*? “没有将它添加到标签中”意味着什么......没有在XPath表达式中使用名称空间前缀? “这是无效的”是什么意思 - 请显示您认为无效的代码(在更多情况下),并告诉是什么让您认为它无效。您展示的名称空间前缀声明肯定是格式良好的,并且不会使XSL样式表“无效”。 – LarsH 2012-07-11 15:08:52

+0

此外,如果区分“名称空间”和“名称空间前缀”和“名称空间前缀声明”,而不是将它们全部命名为“名称空间”,则有关此主题的问题和解答将更容易理解。例如。当你说“没有命名空间”时,这是不正确的。显然你的意思是“没有名称空间前缀”。这可能是因为你不熟悉命名空间声明是如何工作的。我不会因此对你有任何缺点,但会提供这样的建议,即一个专门研究基础知识的小时将使生活变得更加轻松,并且避免以后几小时的挫折。 – LarsH 2012-07-11 15:12:13

回答

1

你糊涂!

你说:“所以没有名称空间来识别xsl标签”。但是有一个命名空间 - 命名空间是http://www.w3.org/2001/XMLSchema。没有前缀,但前缀对XSLT无关紧要;为了编写XSLT处理代码,您唯一需要知道的是名称空间URI。例如,如果你想匹配一个复杂类型元素,你需要写的

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

当然相当于,你通常会使用前缀比ajkt更容易识别(可能是XS或XSD),和你通常会将声明放在xsl:stylesheet元素上,但这只是表面化妆。

+0

是的!我懂了!非常感谢! – sangtraceur 2012-07-12 05:29:32

3

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

快速回答是,要选择一个名称不含空格的元素(默认名称空间中的namespace-uri不是空字符串),您需要在XSLT代码中将前缀绑定到名称空间并使用所定义的前缀引用任何前缀不变的元素名称。

在这种特殊情况下

//complexType 

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

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

//xsd:complexType 
+0

+1有助于尝试回答非常不清楚的问题。 – LarsH 2012-07-11 15:13:19

+0

@LarsH:不客气:) – 2012-07-11 16:11:07