【问题标题】:Finding xmlns with xsl/xpath使用 xsl/xpath 查找 xmlns
【发布时间】:2009-08-23 17:53:47
【问题描述】:

我正在尝试使用转换获取 xml 文档的根元素的信息列表。我想不通的部分是:

如何获取默认命名空间url?

如何获取每个 xmlns 前缀及其相关 url 的列表?

这是我的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/example.xsl"?>
<foo:mytag xmlns="http://default.example.com/" 
           xmlns:foo="http://foo.example.com/" 
           xmlns:bar="http://bar.example.com">
</foo:mytag>

这是我的 xsl 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output
     doctype-public="-//W3C//DTD XHTML 1.1//EN"
     doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
     encoding="UTF-8"
     indent="yes"
     method="xml"
     omit-xml-declaration="no"
     version="1.0" />

    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <title></title>
            </head>
            <body>
                default namespace - <b>???</b><br />
                full tag name - <b><xsl:value-of select="name(*)"/></b><br />
                xmlns for tag - <b><xsl:value-of select="namespace-uri(*)"/></b><br />
                tag prefix - <b>???</b><br />
                tag name - <b><xsl:value-of select="local-name(*)"/></b><br />
                List of xmlns - <br />
                ????
            </body>
        </html>
</xsl:template>

此转换正在浏览器中完成。结果基本上是我所期望的:

default namespace - http://default.example.com/
full tag name - foo:mytag
xmlns for tag - http://foo.example.com/
tag prefix - foo
tag name - mytag
List of xmlns -
        - http://default.example.com/
    foo - http://foo.example.com/
    bar - http://bar.example.com/

我是否遗漏了一些明显的东西来填充缺失的数据?

【问题讨论】:

  • 你想达到什么目的?想要知道与节点关联的命名空间比只想要命名空间声明列表更常见。

标签: xml xslt xpath


【解决方案1】:

我认为这大致符合您的要求。 XSLT 1.0 - 在 XMLSpy 中测试

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title></title>
        </head>
        <body>
            default namespace - <b><xsl:value-of select="*/namespace::*[not (name())]"/></b><br />
            full tag name - <b><xsl:value-of select="name(*)"/></b><br />
            xmlns for tag - <b><xsl:value-of select="namespace-uri(*)"/></b><br />
            tag prefix - <b><xsl:value-of select="substring-before(name(*),':')" /></b><br />
            tag name - <b><xsl:value-of select="local-name(*)"/></b><br />
            List of xmlns - <br />
            <xsl:for-each select="*/namespace::*">
               <xsl:if test="not (name() = 'xml')"><xsl:text>
                   </xsl:text>
                   <xsl:value-of select="name()" /><xsl:text> - </xsl:text><xsl:value-of select="." /><br />
               </xsl:if>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多