Xml 动态名称空间

Xml 动态名称空间,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我不熟悉XML转换(XSLT)。 我正试图找出我面临的一个名称空间问题,需要一些帮助 详情如下: XSLT文件: 但我不相信这一点,因为我的XSLT文件中有数百个元素,我需要像上面那样修改每个元素 有什么方法可以强制子元素名称空间从其父节点派生吗?这不是关于XSLT,而是关于一般的名称空间。声明命名空间时,该命名空间对于该节点和所有后续节点都处于活动状态 因此,如果希望ForeName和Middlename的默认名称空间与父Name的名称空间匹配,只需不在子元素上声明它,如下所示: <?x

我不熟悉XML转换(XSLT)。 我正试图找出我面临的一个名称空间问题,需要一些帮助

详情如下:

XSLT文件: 但我不相信这一点,因为我的XSLT文件中有数百个元素,我需要像上面那样修改每个元素


有什么方法可以强制子元素名称空间从其父节点派生吗?

这不是关于XSLT,而是关于一般的名称空间。声明命名空间时,该命名空间对于该节点和所有后续节点都处于活动状态

因此,如果希望
ForeName
Middlename
的默认名称空间与父
Name
的名称空间匹配,只需不在子元素上声明它,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Address xmlns="http://gov.co.uk">
    <Name xmlns="http://gov.co.uk/Test/1">
        <ForeName>Rex</ForeName>
        <MiddleName>XYZ</MiddleName>
    </Name>
    <street xmlns="http://gov.co.uk/Test/1">
        <DoorNo>123</DoorNo>
    </street>
</Address>

雷克斯
XYZ
123
有没有办法强制子元素名称空间从其父节点派生

不是直接的,最简单的方法可能是分两个阶段进行转换。首先执行当前转换,将结果存储在一个变量中,然后重新处理该变量的内容,将任何无命名空间元素“移动”到作为参数的特定命名空间中:

<xsl:param name="NameSpace" select="'http://gov.co.uk/Test/1'" />

<xsl:template match="/">
  <xsl:variable name="stageOne">
    <!-- your current processing here -->
  </xsl:variable>
  <xsl:apply-templates mode="fix-ns" select="msxsl:node-set($stageOne)" />
</xsl:template>

<!-- copy everything as-is ... -->
<xsl:template match="@*|node()" mode="fix-ns">
  <xsl:copy><xsl:apply-templates select="@*|node()" mode="fix-ns" /></xsl:copy>
</xsl:template>

<!-- ... except element in no namespace, which we move into $NameSpace -->
<xsl:template match="*[namespace-uri() = '']" mode="fix-ns">
  <xsl:element name="{local-name()}" namespace="{$NameSpace}">
    <xsl:apply-templates select="@*|node()" mode="fix-ns" />
  </xsl:element>
</xsl:template>
具有相同名称空间的原因是您将它们添加为文本结果元素Literal元素获取样式表中其作用域中的名称空间定义的副本。在您的示例中,这是在
行中完成的另一方面,使用xslt命令生成的元素(如
不复制样式表中定义的名称空间。

如果需要将所有文字元素(除了
)放入命名空间
http://gov.co.uk/Test/1
只需添加一个默认名称空间定义
xmlns=”http://gov.co.uk/Test/1“
元素中,并使用
创建
元素


如果文字元素具有多个不同的名称空间,则将该名称空间定义添加到文字元素最近的父元素中。例如,使用
的所有文字后代放入
http://gov.co.uk/Test/1
名称空间。

我认为他需要处理一个非静态名称空间。@CarloCannas我不太确定,但如果没有输入XML,很难说。OP采用的方法适用于使用属性值模板的动态名称空间,但名称空间似乎是固定的,OP只希望它级联到子元素,如图所示。
<xsl:element name="ForeName" namespace="{$NameSpace}">REX</xsl:element>
<?xml version="1.0" encoding="utf-8"?>
<Address xmlns="http://gov.co.uk">
    <Name xmlns="http://gov.co.uk/Test/1">
        <ForeName>Rex</ForeName>
        <MiddleName>XYZ</MiddleName>
    </Name>
    <street xmlns="http://gov.co.uk/Test/1">
        <DoorNo>123</DoorNo>
    </street>
</Address>
<xsl:param name="NameSpace" select="'http://gov.co.uk/Test/1'" />

<xsl:template match="/">
  <xsl:variable name="stageOne">
    <!-- your current processing here -->
  </xsl:variable>
  <xsl:apply-templates mode="fix-ns" select="msxsl:node-set($stageOne)" />
</xsl:template>

<!-- copy everything as-is ... -->
<xsl:template match="@*|node()" mode="fix-ns">
  <xsl:copy><xsl:apply-templates select="@*|node()" mode="fix-ns" /></xsl:copy>
</xsl:template>

<!-- ... except element in no namespace, which we move into $NameSpace -->
<xsl:template match="*[namespace-uri() = '']" mode="fix-ns">
  <xsl:element name="{local-name()}" namespace="{$NameSpace}">
    <xsl:apply-templates select="@*|node()" mode="fix-ns" />
  </xsl:element>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']" mode="fix-ns">
  <xsl:element name="{local-name()}" namespace="{namespace-uri(..)}">
    <xsl:apply-templates select="@*|node()" mode="fix-ns" />
  </xsl:element>
</xsl:template>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:out-xsl="urn:result" exclude-result-prefixes="out-xsl">

  <xsl:namespace-alias stylesheet-prefix="out-xsl" result-prefix="xsl" />

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <!-- match any literal result element <foo> which is not in a namespace -->
  <xsl:template match="xsl:template//*[namespace-uri() = '']">
    <!-- replace it with <xsl:element name="foo" namespace="{$NameSpace}"> -->
    <out-xsl:element name="{local-name()}" namespace="{{$NameSpace}}">
      <xsl:apply-templates select="@*|node()" />
    </out-xsl:element>
  </xsl:template>
</xsl:stylesheet>