XSLT - 如何输出名称空间前缀但不输出名称空间定义

时间:2013-10-14 07:26:42

标签: xml xslt

我需要生成包含命名空间别名但不包含定义的输出:

<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>

提前致谢

4 个答案:

答案 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和名称空间的知识。谢谢大家。