【问题标题】:Namespace identifiers not working命名空间标识符不起作用
【发布时间】:2023-04-02 23:00:01
【问题描述】:

这是我的练习代码,将应用于一个基本的 xml 文档:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns="http://www.xml.com/books" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
     <html>
        <head>
            <title>XSLT</title>
            <style>
                h1, p {margin:0;}
            </style>
        </head>
     <body>
        <xsl:for-each select="/bookstore/book"> 
            <h1><xsl:value-of select="title"/></h1>
            <p>
                by
                <xsl:for-each select="author">
                    <xsl:value-of select="text()"/>
                </xsl:for-each>
                <xsl:text>, </xsl:text>

                <xsl:value-of select="year"/><br/>

                Price: £<xsl:value-of select="price"/><br/>

                <xsl:if test="photo">
                    <img style="height:200px;">
                        <xsl:attribute name="src">
                            <xsl:value-of select="photo"/>
                        </xsl:attribute>
                    </img>
                </xsl:if>
            </p>
        </xsl:for-each>
     </body>
     </html>
    </xsl:template>
</xsl:stylesheet>
  1. 现在有人告诉我命名空间可以是任何东西。大多数情况下使用 URL。那么为什么,当我尝试这段代码时,一切都会中断,格式化,很多。但是,当我将默认命名空间的标识符更改为“http://www.w3.org/1999/xhtml”时,它可以完美运行,如果它不是 xsl/transform 链接,则与 xsl 命名空间相同。

命名空间只是没有点击我。我理解他们为什么在那里以及他们的目的,但我不明白为什么这样的事情是这样的。

  1. 另外,当您有两种类型的数据时,xml 和 html,命名空间如何知道哪个是 html 和哪个是 xml 以应用适当的格式?

非常感谢您的帮助!

【问题讨论】:

  • 像往常一样,Jeni 说得最好。见The perils of default namespaces
  • 您的问题并不完全清楚。如果你的结果应该是 HTML,那么很自然,你不想将输出元素放在任意命名空间中(尽管许多浏览器会很乐意忽略它)。
  • 我只是在这儿闲逛。我要澄清的主要问题是,如果命名空间不是我提到的那些(两个 w3 链接),为什么命名空间会中断。当我读过的所有指南都说命名空间标识符可以是任何东西时。
  • "我只是在这儿玩玩。" 好吧,当问题不具体时,这很难回答。 -- "我读过的所有指南都说命名空间标识符可以是任何东西。" 命名空间标识符不能是任何东西。它们必须符合您和您的接收者之前达成的协议(我假设我们正在讨论您输出中的命名空间)。如果您的目标应用程序希望事物位于命名空间 X 中,那么当它们位于命名空间 Y 中时它将中断。
  • 你要我重复我说的话。

标签: xml xslt namespaces


【解决方案1】:

您需要围绕 Qualified Names(或简称 QNames)的概念展开思考。 XML 中的许多实体,如元素和属性,由 QNames 标识,QNames 由名称空间和本地名称组成。例如这个元素:

<foo:bar xmlns:foo="qwertyuiop">

由 QName 标识

{quertiuiop}bar

请注意,foo 不是 QName 的一部分。像foo 这样的命名空间前缀是一种简写形式,可以避免我们一遍又一遍地输入命名空间字符串。还要注意命名空间字符串qwertyuiop 是任意的。通常,按照惯例,URI 被用作命名空间标识符,但这只是因为希望这样可以防止冲突。如果我拥有jimrussell.us 域,我对使用名为http://jimrussell.us/xsl/functions 的命名空间很有信心。

考虑一下:对于一个 XML 处理器(如果它工作正常的话),这三个 XML 文档是完全等价的:

<foo:root xmlns:foo="urn:foo:space">
    <foo:child/>
</foo:root>

<xxx:root xmlns:xxx="urn:foo:space">
    <yyy:child xmlns:yyy="urn:foo:space"/>
</xxx:root>

<root xmlns="urn:foo:space">
    <child/>
</root>

在最后一个示例中,我终于开始使用 default 命名空间,没有前缀的所有内容都存在于该命名空间中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2012-09-16
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多