Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT命名空间和默认命名空间问题_Xslt - Fatal编程技术网

XSLT命名空间和默认命名空间问题

XSLT命名空间和默认命名空间问题,xslt,Xslt,我不熟悉XSLT转换。我的输出xml中存在名称空间映射问题 输入XML是 你好 所以您不想删除“class”元素的名称空间,而是想更改它。使用xsl:element节点的“namespace”属性 而不是 <xsl:element name="{local-name()}"> 你想要 <xsl:element name="{local-name()}" namespace="http://www.neededNamespace.com"> 你真的需要这些代码吗

我不熟悉XSLT转换。我的输出xml中存在名称空间映射问题

输入XML是


你好

所以您不想删除“class”元素的名称空间,而是想更改它。使用xsl:element节点的“namespace”属性

而不是

<xsl:element name="{local-name()}">

你想要

<xsl:element name="{local-name()}" namespace="http://www.neededNamespace.com">

你真的需要这些代码吗?或者你只是把它当作咒语,希望它能以某种方式安抚邪恶的灵魂?像
xpath默认名称空间
在XSLT1.0样式表中做什么?(回答:要么什么都没有,要么产生致命错误-取决于处理器的容忍度)

现在,如果您的XML示例具有代表性,那么您需要做的就是:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.neededNamespace.com">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <school>
        <xsl:apply-templates/>
    </school>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

它的作用是:

  • 创建一个名为
    的新根元素
  • 为每个现有元素创建一个新元素,并使用现有元素的本地名称将其命名
  • 由于样式表包含一个默认名称空间的声明所有新创建的元素(在上面的#1和#2中)都将放置在该名称空间中

    因为您的输入不包含任何属性,所以这应该是所需的全部代码

    如果您担心他们将来可能会添加一些您希望传递到输出的属性,只需将第二个模板更改为:

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    
    
    

    这假设属性不在名称空间中——这是一个非常合理的假设。属性不继承其父级的命名空间,而且您很少看到作者显式地将属性放置在命名空间中。只有当您真的需要预测这种可能性时,您才需要额外的代码来处理属性。

    感谢bjimba的宝贵意见。在包含您提到的名称空间值之后。我得到了下面的输出,这是出乎意料的<代码>注意,我在学校和班级之间还有一些其他名称空间的标记和元素。我不知道为什么这不是预期的。它们现在位于正确的名称空间中。根据XSL处理器的不同,这样说可能会比您希望的更详细。这里您应该密切关注Michael的答案,它比我快速指向xsl:element的namespace属性的指针要详细得多。花时间通过一个好的网站(甚至是一本书)来理解XML名称空间是值得的,搜索“XSLT默认名称空间”并找到666个落入相同陷阱的人。