首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xslt生成Xslt:设置根名称空间

Xslt生成Xslt:设置根名称空间
EN

Stack Overflow用户
提问于 2012-01-20 06:10:39
回答 2查看 309关注 0票数 2

我使用XSLT作为各种组件的“代码生成器”,包括其他XSLT。例如,我有一个查询,它生成表的MSSQLXSLT行的XML输出,并且希望生成一个包含表的sys.columns,其中的每一行都有一列。

因此,我想生成以下XSLT:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ...
</xsl:stylesheet>

我生成上面的XSLT时使用的是类似这样的“生成器”XSLT:

代码语言:javascript
复制
<xsl:element name="xsl:stylesheet">
  <xsl:attribute name="version">1.0</xsl:attribute>
  <xsl:attribute name="format" namespace="http://www.w3.org/XML/1998/namespace" >urn:qbo3-formatting</xsl:attribute>
  ...
</xsl:element>

问题是这个“生成器”XSLT生成:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xml:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ...
</xsl:stylesheet>

请注意xml:format,而不是所需的xmlns:format

根据W3C的说法,'xmlns‘是保留的并绑定到'http://www.w3.org/2000/xmlns/'’。如果我尝试使用这个名称空间创建上面的format属性,我会得到一个错误:

Elements and attributes cannot belong to the reserved namespace 'http://www.w3.org/2000/xmlns/'.

对解决方法有什么建议吗?

提前谢谢你,

埃里克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-20 09:55:02

这正是 instruction的主要用例

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:format="some:format"
 xmlns:xxx="xxx">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/">
    <xxx:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:format="some:format"
     >

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

 </xsl:template>
</xsl:stylesheet>

将此转换应用于任何XML文档(未使用)时,将生成所需的结果(包含所有所需属性和名称空间的新样式表):

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:format="some:format">
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

一定要注意:当转换需要生成另一个XSLT样式表时,请避免使用xsl:element,最好使用xsl:namespace-alias

票数 1
EN

Stack Overflow用户

发布于 2012-01-20 06:18:01

试着这样做:

代码语言:javascript
复制
<xsl:element name="xsl:stylesheet">
  <xsl:attribute name="version">1.0</xsl:attribute>
  <xsl:namespace name="format" select="'urn:qbo3-formatting'"/>
</xsl:element>

或者,不是显式地输出XML名称空间,而是允许XSLT在使用该名称空间的节点时自动生成XML名称空间。如果没有元素正在使用urn:qbo3-formatting,那么就不需要名称空间声明。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8934116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档