在xs:schema元素输出中使用xsl:param变量

时间:2013-03-29 09:20:46

标签: xslt xsd

我正在尝试从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_namexsl: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}">

2 个答案:

答案 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元素中。