【发布时间】:2017-11-11 15:01:44
【问题描述】:
我想创建这样的 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" 命名空间的定义,有什么办法可以防止丢失这个命名空间?
【问题讨论】:
-
为了稍微扩展 Martin Honnen 的回答,我想指出缺少重复的
ins命名空间声明没有任何作用。任何符合标准的 XML 处理器都将认识到根元素上的ins命名空间声明也适用于此ins:InnerDoc元素。任何将这个ins:InnerDoc元素的位置移动到其他位置(根元素上的声明不适用)的一致 XSL 处理器也将根据需要添加到命名空间声明中。 -
我知道,但是这个要求来自其他系统,我真的不知道如果没有这个命名空间他们会正确接收我的消息。无论如何,谢谢你的评论!
标签: xslt namespaces xsi