我必须使用xlst将xml转换为html。如果不考虑名称空间声明,这非常简单。
因为找到处理命名空间的解决方案时遇到了一些麻烦,而且如果可以通过更简单的方式完成此操作,我就会很蠢。我会创建这篇文章。
我的问题是: 如何在声明xml时声明它,而不是在每个节点上打印。
给定以下xml,声明命名空间时应该打印它们。根元素有两个名称空间声明,但调用
namespace::node()
列出所有命名空间。
<foo:root xmlns:foo="http://www.foo.com" xmlns:bar="http://www.bar.com">
<xx:child xmlns:xx="http://www.xx.com" />
<bar:otherChild>
<defaultNamespace />
</bar:otherChild>
</foo:root>
解决方案:
<!--
Select the current namespace without the xml namespace and without the namespaces of all ancestors (parents)
-->
<xsl:for-each select="namespace::node()[name()!='xml'][not(.=ancestor::*[position()>1]/namespace::*)]">
<xsl:variable name="name" select="name(current())" /> <!-- would be foo -->
<xsl:variable name="namespace" select="current()" /> <!-- http://www.foo.com -->
</xsl:for-each>
答案 0 :(得分:0)
我认为你正在寻找的表达方式是......
<xsl:for-each select="namespace::node()[name()!='xml'][not(. = ../ancestor::*/namespace::node())]">
即。如果命名空间在当前节点的祖先上不存在,则写出命名空间。
试试这个XSLT作为例子
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:text>Node: </xsl:text><xsl:value-of select="local-name()" />
<xsl:text> </xsl:text>
<xsl:for-each select="namespace::node()[name()!='xml'][not(. = ../ancestor::*/namespace::node())]">
<xsl:value-of select="name(current())" />
<xsl:text> - </xsl:text>
<xsl:value-of select="current()" />
<xsl:text> </xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>