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