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>