我需要生成包含命名空间别名但不包含定义的输出:
<my:Risks>
<my:Risk>
<my:ID>1</my:ID>
<my:Description><div>test1</div></my:Description>
</my:Risk>
<my:Risk>
<my:ID>2</my:ID>
<my:Description><div>test2</div></my:Description>
</my:Risk>
</my:Risks>
来自此输入:
<ArrayOfRisk>
<Risk>
<ID>1</ID>
<Description><div>test1</div></Description>
</Risk>
<Risk>
<ID>2</ID>
<Description><div>test2</div></Description>
</Risk>
</ArrayOfRisk>
我正在使用此XSLT,但需要知道如何不在输出中显示“my”命名空间定义:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:my='http://blaha.com'>
<xsl:template match="/">
<my:Risks>
<xsl:apply-templates select="//Risk"/>
</my:Risks>
</xsl:template>
<xsl:template match="Risk">
<my:Risk>
<xsl:apply-templates/>
</my:Risk>
</xsl:template>
<xsl:template match="ID">
<my:ID><xsl:value-of select="." /></my:ID>
</xsl:template>
<xsl:template match="Description">
<my:Description><xsl:copy-of select="node()" /></my:Description>
</xsl:template>
</xsl:stylesheet>
提前致谢
答案 0 :(得分:1)
生成的XML将插入到已定义名称空间的现有文档中。
这实际上不是一个问题,因为冗余的命名空间声明不会造成伤害。
<foo:bar xmlns:foo="http://example.com">
<foo:baz xmlns:foo="http://example.com"/>
</foo:bar>
与
完全相同<foo:bar xmlns:foo="http://example.com">
<foo:baz />
</foo:bar>
就任何可识别名称空间的XML解析器而言。如果您想首先避免包含名称空间声明,那么您需要使用XML-aware工具而不是简单的字符串连接来组装最终文档。例如,在Java中,您可以使用类似StAX XMLStreamWriter之类的东西来构建XML,然后当您到达应该插入转换结果的点时,将开放式编写器传递给Transformer(在StAXResult中)并且它将在现有命名空间声明的上下文中编写输出,并且知道不会添加额外的冗余声明。
答案 1 :(得分:0)
建议的XML无效:
<my:Risks>
<my:Risk>
<my:ID>1</my:ID>
<my:Description><div>test1</div></my:Description>
</my:Risk>
<my:Risk>
<my:ID>2</my:ID>
<my:Description><div>test2</div></my:Description>
</my:Risk>
</my:Risks>
必须定义命名空间前缀。 XSLT引擎将始终输出有效的XML,因此无法生成上述内容。
XML是关于数据 - 而不是化妆品!
答案 2 :(得分:0)
XSLT无法生成非命名空间格式的输出。
答案 3 :(得分:0)
嗯,我猜这里每个人都是正确的。为了我的目的,字符串操作工作但我学到了更多关于xslt和名称空间的知识。谢谢大家。