XSLT 缺少与根元素具有相同命名空间声明的内部标记中的命名空间
XSLT missing namespaces in inner tags that have same namespace declaration as the root element
我想这样创建 xml:
<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd">
<rns:DocumentWrapper>
<ins:InnerDoc xmlns:ins="urn:inner-doc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:inner-doc inner-doc.xsd">
<ins:Value>Some text</ins:Value>
</ins:InnerDoc>
</rns:DocumentWrapper>
</rns:RootElement>
使用此模板:
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<rns:RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rns="urn:root-element"
xsi:schemaLocation="urn:root-element root-element.xsd">
<rns:DocumentWrapper>
<ins:InnerDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ins="urn:inner-doc"
xsi:schemaLocation="urn:inner-doc inner-doc.xsd">
<ins:Value><xsl:value-of select="//*[local-name()='SomeNode']"/></ins:Value>
</ins:InnerDoc>
</rns:DocumentWrapper>
</rns:RootElement>
</xsl:template>
但是这个模板没有给我想要的结果,而是给了我一些不同的结果:
<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd">
<rns:DocumentWrapper>
<ins:InnerDoc xmlns:ins="urn:inner-doc" xsi:schemaLocation="urn:inner-doc inner-doc.xsd">
<ins:Value>Some text</ins:Value>
</ins:InnerDoc>
</rns:DocumentWrapper>
</rns:RootElement>
如您所见,在转换结果中,InnerDoc元素缺少xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"命名空间的定义,有什么办法可以防止这个命名空间丢失?
由于名称空间声明 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
出现在根元素上,因此它在子元素和后代元素的范围内,不需要对 ins:InnerDoc
元素重复。我不知道有什么方法可以使用 XSLT 强制输出重复的命名空间声明。
其他一些 API 有办法抑制它们,例如 LINQ to XML 和 SaveOptions
https://msdn.microsoft.com/en-us/library/system.xml.linq.saveoptions(v=vs.110).aspx 上的 OmitDuplicateNamespaces
,但该选项被添加到将 LINQ 序列化为 XML 树时禁止重复命名空间声明,而不是强制执行它们。
我想这样创建 xml:
<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd">
<rns:DocumentWrapper>
<ins:InnerDoc xmlns:ins="urn:inner-doc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:inner-doc inner-doc.xsd">
<ins:Value>Some text</ins:Value>
</ins:InnerDoc>
</rns:DocumentWrapper>
</rns:RootElement>
使用此模板:
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<rns:RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rns="urn:root-element"
xsi:schemaLocation="urn:root-element root-element.xsd">
<rns:DocumentWrapper>
<ins:InnerDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ins="urn:inner-doc"
xsi:schemaLocation="urn:inner-doc inner-doc.xsd">
<ins:Value><xsl:value-of select="//*[local-name()='SomeNode']"/></ins:Value>
</ins:InnerDoc>
</rns:DocumentWrapper>
</rns:RootElement>
</xsl:template>
但是这个模板没有给我想要的结果,而是给了我一些不同的结果:
<rns:RootElement xmlns:rns="urn:root-element" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:root-element root-element.xsd">
<rns:DocumentWrapper>
<ins:InnerDoc xmlns:ins="urn:inner-doc" xsi:schemaLocation="urn:inner-doc inner-doc.xsd">
<ins:Value>Some text</ins:Value>
</ins:InnerDoc>
</rns:DocumentWrapper>
</rns:RootElement>
如您所见,在转换结果中,InnerDoc元素缺少xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"命名空间的定义,有什么办法可以防止这个命名空间丢失?
由于名称空间声明 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
出现在根元素上,因此它在子元素和后代元素的范围内,不需要对 ins:InnerDoc
元素重复。我不知道有什么方法可以使用 XSLT 强制输出重复的命名空间声明。
其他一些 API 有办法抑制它们,例如 LINQ to XML 和 SaveOptions
https://msdn.microsoft.com/en-us/library/system.xml.linq.saveoptions(v=vs.110).aspx 上的 OmitDuplicateNamespaces
,但该选项被添加到将 LINQ 序列化为 XML 树时禁止重复命名空间声明,而不是强制执行它们。