XSLT:将<element> </element>转换为<element> </element>

时间:2009-07-09 04:18:00

标签: xslt

我需要做些什么:

    <xsl:template match="xs:simpleType">
      <xsl:copy>
        <xsl:copy-of select="node()[not(self::xs:annotation or self::xs:restriction)]|@*"/>
      </xsl:copy>
    </xsl:template>

目前,事实证明:

<xs:simpleType xmlns:core="urn:org:pesc:core:CoreMain:v1.4.0" name="SINIDType">


</xs:simpleType>

我希望它看起来像:

<xs:simpleType name="SINIDType" />

2 个答案:

答案 0 :(得分:3)

在那里有空行,看起来你的select语句是(正确地)选择你的空白节点以及你的元素。尝试使用

select="*[not(self::xs:annotation or self::xs:restriction)]|@*"

只会匹配元素节点,而不是文本节点。

答案 1 :(得分:0)

序列化程序负责将空元素作为<abc></abc><abc/>发出,并且它们完全等效。有些序列化程序没有选项,并且总是生成一个或另一个。

但可能是你在他们之间散发空白;在这种情况下,您必须将xsl:copy更改为不包含无关紧要的空格的其他内容,例如将or text() = ''添加到谓词中。

就消除xmlns:core命名空间声明而言,这取决于您的上下文。如果在您的类型中存在需要它的元素,或者您正在使用XSLT并且未在@exclude-result-prefixes根元素上使用<xsl:stylesheet>属性排除名称空间,则将始终生成它。即便如此,根据您的处理器环境,序列化程序可能“决定”它需要不必要的命名空间输出,因为它在输入范围内。

另外,看到<xsl:copy> ... <xsl:copy-of .../> ... </xsl:copy>有点奇怪。你真的不应该将copy-of包裹在copy内。只需将其copy-of