我使用XSLT作为各种组件的“代码生成器”,包括其他XSLT。例如,我有一个查询,它生成表的MSSQLXSLT行的XML输出,并且希望生成一个包含表的sys.columns,其中的每一行都有一列。
因此,我想生成以下XSLT:
<xsl:stylesheet version="1.0" xmlns:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:stylesheet>我生成上面的XSLT时使用的是类似这样的“生成器”XSLT:
<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生成:
<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/'.
对解决方法有什么建议吗?
提前谢谢你,
埃里克
发布于 2012-01-20 09:55:02
这正是 instruction的主要用例
<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文档(未使用)时,将生成所需的结果(包含所有所需属性和名称空间的新样式表):
<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。
发布于 2012-01-20 06:18:01
试着这样做:
<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,那么就不需要名称空间声明。
https://stackoverflow.com/questions/8934116
复制相似问题