【问题标题】:Processing xsd with xsl without namespaces使用没有命名空间的 xsl 处理 xsd
【发布时间】:2012-07-11 12:37:16
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 您需要更清楚自己尝试过的内容。您的意思是您将 xmlns:xsd 名称空间前缀声明添加到您的 XSL 样式表? “不将其添加到标签”是什么意思……不使用 XPath 表达式中的命名空间前缀? “它无效”是什么意思 - 请显示您认为无效的代码(在更多上下文中),并说明是什么让您认为它无效。您展示的命名空间前缀声明肯定是格式正确的,并且不会使 XSL 样式表“无效”。
  • 此外,如果您区分“命名空间”和“命名空间前缀”和“命名空间前缀声明”,而不是将它们都称为“命名空间”,那么有关此主题的问题和答案将更容易理解。例如。当您说“没有名称空间”时,那不是真的。显然你的意思是“没有命名空间前缀”。您可能不熟悉命名空间声明的工作方式。我不会因此而责怪你,但我会建议你在这个领域花一小时的时间专门学习基础知识,这将使生活变得更加轻松,并避免之后数小时的挫败感。

标签: xml xslt xsd schema


【解决方案1】:

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

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

在这种特殊情况下

//complexType

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

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

//xsd:complexType

【讨论】:

    【解决方案2】:

    你很困惑!

    你说:“所以没有命名空间来识别 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 元素上,但这只是装饰性的。

    【讨论】:

    • 是的!我懂了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多