我想创建以下元素:
<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">
哪个看起来与我想要的相似...
答案 0 :(得分: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名称空间。
我刚刚编写模板匹配来测试。
答案 1 :(得分: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
属性的值中指定所有此类前缀,以便命名空间不会在所有文字结果元素上自动传播。
答案 2 :(得分:1)
你可以简单地使用: -
<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">
直接在您的XSL中,如果不能对标记名称进行硬编码,那么您只需要xsl:element。与属性类似,您可以直接添加它们,除非您需要进行条件化。