XML XSL名称空间

XML XSL名称空间,xml,xslt,xpath,Xml,Xslt,Xpath,我正在使用XSL从自动生成的XML文件创建报告。在文件中,我的根节点包含时间戳作为名称空间。当我生成包含XML文件中时间戳的HTML报告时,我无法提取节点中的属性。当我删除它时,它工作正常。有人能解释一下这个话题吗。谢谢 使用时间戳: <AdminReports xmlns="30/11/2011 09:25:58"> <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE AdminReports []>

我正在使用XSL从自动生成的XML文件创建报告。在文件中,我的根节点包含时间戳作为名称空间。当我生成包含XML文件中时间戳的HTML报告时,我无法提取节点中的属性。当我删除它时,它工作正常。有人能解释一下这个话题吗。谢谢

使用时间戳:

<AdminReports xmlns="30/11/2011 09:25:58">

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE AdminReports []>
<?xml-stylesheet type="text/xsl" href="AdminReport.xsl"?>

<AdminReports xmlns="30/11/2011 09:25:58">
  <AdminReport ID="1">
  </AdminReport >
</AdminReports>

此值不应存储在
xmlns
中,但您可以在XPath 2.0中使用
名称空间-uri()
访问它:

xmlns=“…”
不是属性声明,而是命名空间声明。这意味着元素
AdminReports
位于命名空间中

我假定在XSL中,没有与以下URI“
30/11/2011 09:25:58
”对应的名称空间声明。因此,XSL不会给出预期的结果。如果删除名称空间声明后得到了良好的结果,那么这意味着XSL适用于没有名称空间的XML

在转换之前,可以添加第一个XSL来删除名称空间。这个例子:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:for-each select="@*">
                <xsl:attribute name="{local-name()}" >
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>    
</xsl:stylesheet>


另一种选择是更改XSL,使其成为“名称空间感知的”。

因为默认名称空间的名称空间uri是一个时间戳——这意味着它对于每个自动生成的文档都可能不同,因此无法在XSLT代码中定义“此”名称空间

还有另一种方法——不是直接使用不固定的名称,而是将它们与元素的
name()
进行比较:

/*/*[name()='AdminReport']/@ID
正确选择名为“AdminReport”的任何元素(它所属的命名空间)的
ID
属性,该元素是XML文档顶部元素的子元素

这里是一个完整的XSLT示例

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select=
    "/*/*[name()='AdminReport']/@ID"/>
 </xsl:template>
</xsl:stylesheet>
<AdminReports xmlns="30/11/2011 09:25:58">
    <AdminReport ID="1">
    </AdminReport >
</AdminReports>
1

我真的不需要访问它。我正在从另一个属性获取信息,当它位于xml文件中时,它会阻止我访问它。@NewUser101-Ahh…您正在处理的是一个默认名称空间。关于这个话题有很多问题/答案。我将尝试查找一些,看看这个:它有XSLT1.0和2.0的选项。如果使用XSLT1.0,您将遇到的问题是,如果基于时间戳,
xmlns
将发生变化。每次
xmlns
发生变化时,您都会修改XSLT。另外,请看一下Mads的回答这是一个使用
local-name()
如何让它知道名称空间的好例子。如果名称空间是固定的,您可以添加
xsl:xpath-default-namespace
属性,其中包含固定的名称空间(但这仅适用于xslt 2.0)。如果名称空间经常更改,可能就没那么容易了,而且可能是更改xsl使其忽略名称空间,但之后代码不容易维护(例如,编写
match=“*[local-name()='elt']”,而不是
match=“elt”
)谢谢Dimitre!!!效果很好!你能让我进一步阅读这个主题以及我可能遇到的其他挑战吗。@新用户101:不客气。迈克尔·凯和杰尼·坦尼森的书都是不错的读物。请看我的推荐:
1