10

我想创建以下元素:

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">

如果我使用这样的东西:

<xsl:element name="excercises">
<xsl:attribute name="xmlns:xsi" namespace="http://www.w3.org/2001/XMLSchema-instance"/>

然后它会创建这样的东西:

<excercises xp_0:xsi="" xmlns:xp_0="http://www.w3.org/2001/XMLSchema-instance">

这看起来不像我想要的......

4

3 回答 3

8

请尝试以下操作:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:apply-templates select="xml"></xsl:apply-templates>
    </xsl:template>

    <xsl:template match="xml">
        <xsl:element name="exercises">
            <xsl:attribute name="xsi:noNamespaceSchemaLocation">mySchema.xsd</xsl:attribute>
            some value
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

关键问题是在声明中声明 xsi 命名空间。

我只是为了测试而制作了模板匹配。

于 2009-01-08T14:14:23.817 回答
3

这是如何做到的

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 exclude-result-prefixes="xsi">
    <xsl:output omit-xml-declaration="yes"/>
    <!--                                   -->
    <xsl:template match="/">
      <exercises  xsi:noNamespaceSchemaLocation="mySchema.xsd"/>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于任何源 XML 文档(未使用)时,将产生所需的结果:

<exercises xsi:noNamespaceSchemaLocation="mySchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

<xsl:attribute>在您的情况下没有必要使用它,但是如果有必要,它可以毫无问题地使用:

    <xsl:attribute name="xsi:noNamespaceSchemaLocation">
      <xsl:value-of select="'mySchema.xsd'"/>
    </xsl:attribute>

请注意,在<xsl:stylesheet>元素上简单地定义必要的命名空间是一种很好的做法,这样它们就可以在需要的任何地方轻松(重)使用。如果在多个生成的元素或属性上需要给定的命名空间,这将特别有用。

exclude-result-prefixes在这种情况下,最好在属性值中指定所有此类前缀,这样命名空间不会自动传播到所有文字结果元素上。

于 2009-01-08T14:16:41.520 回答
1

你可以简单地使用: -

<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">

直接在您的 XSL 中,这会起作用,如果不能硬编码标签名称,您只需要 xsl:element。与属性类似,您可以直接添加它们,除非您需要设置条件。

于 2009-01-08T14:21:50.713 回答