我正在尝试从XSLT脚本输出以下行。这是xsl:template match="/"
之后的第一行。我想要做的是将XML文档转换为XML模式,并且需要以特定方式输出xs:schema
标记。
<xs:schema xmlns:ed="http://test1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="{$ns_name}" xmlns:tns="{$ns_name}" elementFormDefault="qualified" attributeFormDefault="unqualified" xsi:schemaLocation="http://test1 file://XmlSchemaAppinfo.xsd">
$ns_name
是xsl:param name="ns_name"
。它已在targetNamespace="{$ns_name}"
中正确解析,但在xmlns:tns="{$ns_name}"
中按字面输出
<xs:schema targetNamespace="akolodk" elementFormDefault="qualified" attributeFormDefault="unqualified" xsi:schemaLocation="http://test1 file://XmlSchemaAppinfo.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ed="test1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="{$ns_name}">
答案 0 :(得分:0)
在XSL中,只能使用attribute value templates(使用“{}”表示法)编写一些属性。特别是,xmlns属性不支持表示法。
答案 1 :(得分:0)
命名空间声明不会与属性相同,即使它们看起来相同。在解析样式表之前,XML解析器将处理xmlns:tns
,然后才能到达XSLT处理器。
如果你有XSLT 2.0,你可以使用
<xsl:namespace name="tns" select="$ns_name"/>
在结果树中创建命名空间节点,但我知道在XSLT 1.0中生成动态命名空间并不容易。您无法使用xsl:attribute
,规范明确指出,而
<xsl:attribute name="xmlns:xsl" namespace="whatever">http://www.w3.org/1999/XSL/Transform</xsl:attribute>
不是错误,它将生成属性,而不是命名空间声明 - 处理器需要忽略xmlns
中指定的name
前缀,并且必须使用不同的前缀来输出属性
如果您的处理器支持exslt node-set
扩展功能,则以下可能工作:
<xsd:schema .....>
<xsl:variable name="tnsElement">
<xsl:element name="tns:dummy" namespace="{$ns_name}"/>
</xsl:variable>
<xsl:copy-of select="exsl:node-set($tnsElement)/*/namespace::tns"/>
但允许处理器再次忽略xsl:element
name
属性的前缀并使用绑定到同一URI的不同前缀,您必须使用处理器对其进行测试。
(您必须将xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl"
添加到xsl:stylesheet
元素中。