0

我想像这样创建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" 命名空间的定义,有什么办法可以防止丢失这个命名空间?

4

1 回答 1

1

由于命名空间声明xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"存在于根元素上,因此它在子元素和后代元素的范围内,不需要为ins:InnerDoc元素重复。我不知道用 XSLT 强制输出重复的命名空间声明的任何方法。

其他一些 API 有办法抑制它们,例如 LINQ to XMLOmitDuplicateNamespacesSaveOptions https://msdn.microsoft.com/en-us/library/system.xml.linq.saveoptions(v=vs.110).aspx,但添加该选项是为了在序列化 LINQ to XML 树时抑制重复的命名空间声明,而不是强制它们。

于 2017-06-09T15:14:37.457 回答