XSLT1.0添加名称空间+;xsi:type到元素

XSLT1.0添加名称空间+;xsi:type到元素,xslt,namespaces,Xslt,Namespaces,我想从这里开始: <detail> <BusinessError> <environment>Test</environment> <businesserror> <BusinessCode>my_businesscode</BusinessCode> <BusinessMessage>my_businessmessage</BusinessMes

我想从这里开始:

<detail> 
 <BusinessError> 
   <environment>Test</environment> 
   <businesserror> 
      <BusinessCode>my_businesscode</BusinessCode> 
      <BusinessMessage>my_businessmessage</BusinessMessage> 
   </businesserror> 
  </BusinessError> 
 </detail> 

试验
我的商业代码
我的商业信息
对此(只关注businesserror元素)


试验
我的商业代码
我的商业信息
重要细节(我认为)名称空间uri是作为变量导入的

我可以通过xs:attribute添加xsi:type,并自动添加xsi名称空间 但不是名称空间(xmlns:ns2=“aaaaa”)? 请注意,包含元素(businesserror)的名称空间(ddd)与我试图声明的名称空间(aaaa)不同


谢谢

此XSLT将向根元素添加名称空间定义(详细信息)


ns2:AppErrorType

不要将节点更改为xsl:element节点,因为这不会传递到名称空间定义上。

如果希望动态创建名称空间,则我认为需要将XSLT 2.0与其xsl:namespace元素一起使用:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:param name="v1" select="'ddd'"/>
  <xsl:param name="ns2" select="'aaaa'"/>

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

  <xsl:template match="BusinessError | environment">
    <xsl:element name="v1:{local-name()}" namespace="{$v1}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="businesserror">
    <xsl:element name="v1:{local-name()}" namespace="{$v1}">
      <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance" select="'ns2:AppError'"/>
      <xsl:namespace name="ns2" select="$ns2"/>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="BusinessCode | BusinessMessage">
    <xsl:element name="ns2:{local-name()}" namespace="{$ns2}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

使用XSLT 1.0,您需要对样式表中的名称空间进行硬编码,以便将其复制到:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:v1="ddd"
  xmlns:ns2="aaaa"
  version="1.0">

  <xsl:variable name="ns" select="document('')/xsl:stylesheet/namespace::*"/>

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

  <xsl:template match="BusinessError | environment">
    <xsl:element name="v1:{local-name()}" namespace="{$ns[local-name() = 'v1']}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="businesserror">
    <xsl:element name="v1:{local-name()}" namespace="{$ns[local-name() = 'v1']}">
      <xsl:copy-of select="$ns[local-name() = 'ns2']"/>
      <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance">ns2:AppError</xsl:attribute>      
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="BusinessCode | BusinessMessage">
    <xsl:element name="ns2:{local-name()}" namespace="{$ns[local-name() = 'ns2']}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

ns2:上诉

如果您知道XSLT 1.0处理器支持像exsl:node set这样的扩展函数,那么您可以按如下方式执行:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  version="1.0">

  <xsl:param name="v1" select="'ddd'"/>
  <xsl:param name="ns2" select="'aaaa'"/>

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

  <xsl:template match="BusinessError | environment">
    <xsl:element name="v1:{local-name()}" namespace="{$v1}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="businesserror">
    <xsl:variable name="t1">
      <xsl:element name="ns2:foo" namespace="{$ns2}"/>
    </xsl:variable>
    <xsl:element name="v1:{local-name()}" namespace="{$v1}">
      <xsl:copy-of select="exsl:node-set($t1)/*/namespace::*[local-name() = 'ns2']"/>
      <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance">ns2:AppError</xsl:attribute>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="BusinessCode | BusinessMessage">
    <xsl:element name="ns2:{local-name()}" namespace="{$ns2}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

ns2:上诉
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:v1="ddd"
  xmlns:ns2="aaaa"
  version="1.0">

  <xsl:variable name="ns" select="document('')/xsl:stylesheet/namespace::*"/>

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

  <xsl:template match="BusinessError | environment">
    <xsl:element name="v1:{local-name()}" namespace="{$ns[local-name() = 'v1']}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="businesserror">
    <xsl:element name="v1:{local-name()}" namespace="{$ns[local-name() = 'v1']}">
      <xsl:copy-of select="$ns[local-name() = 'ns2']"/>
      <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance">ns2:AppError</xsl:attribute>      
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="BusinessCode | BusinessMessage">
    <xsl:element name="ns2:{local-name()}" namespace="{$ns[local-name() = 'ns2']}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  version="1.0">

  <xsl:param name="v1" select="'ddd'"/>
  <xsl:param name="ns2" select="'aaaa'"/>

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

  <xsl:template match="BusinessError | environment">
    <xsl:element name="v1:{local-name()}" namespace="{$v1}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="businesserror">
    <xsl:variable name="t1">
      <xsl:element name="ns2:foo" namespace="{$ns2}"/>
    </xsl:variable>
    <xsl:element name="v1:{local-name()}" namespace="{$v1}">
      <xsl:copy-of select="exsl:node-set($t1)/*/namespace::*[local-name() = 'ns2']"/>
      <xsl:attribute name="xsi:type" namespace="http://www.w3.org/2001/XMLSchema-instance">ns2:AppError</xsl:attribute>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="BusinessCode | BusinessMessage">
    <xsl:element name="ns2:{local-name()}" namespace="{$ns2}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>