创建xmlns:xsi名称空间和属性

创建xmlns:xsi名称空间和属性,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我要创建以下元素: <exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd"> 如果我使用这样的东西: <xsl:element name="excercises"> <xsl:attribute name="xmlns:xsi&q

我要创建以下元素:

<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">

然后它会创建这样的soemthing:

<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">


这看起来不像我想要的…

请尝试以下方法:

<?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>

mySchema.xsd
一些价值
关键问题是在声明中声明xsi命名空间


我刚刚在上创建了模板匹配以进行测试。

以下是如何完成此操作的方法:

<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 name="xsi:noNamespaceSchemaLocation">
      <xsl:value-of select="'mySchema.xsd'"/>
    </xsl:attribute>

请注意,在
元素中简单地定义必要的名称空间是一种很好的做法,这样就可以方便地(重新)使用它们。如果在多个生成的元素或属性上需要一个给定的名称空间,这将特别有用

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

您可以简单地使用:-

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


直接在XSL中就可以了,如果不能硬编码标记名,那么只需要XSL:element。类似地,对于属性,您可以直接添加它们,除非您需要设置条件。

您使用的是哪种XSLT解析器?由于没有使用msxsl alais,因此如果您删除它可能会更好,这会使示例更清晰。您为什么会抑制xsi结果前缀?@AnthonyWJones:如果您不包括前缀“xsi”在“exclude result prefixes”属性的值列表中,每个文本结果元素都将输出为具有此命名空间节点。这是e.r.p attr的唯一目的。请看这里: