0

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

<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,但需要知道如何不让“我的”命名空间定义出现在输出中:

<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

4 回答 4

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 的工具而不是简单的字符串连接来组装您的最终文档。例如,在 Java 中,您可以使用 StAX XMLStreamWriter之类的东西构建 XML ,然后当您到达应该插入转换结果的位置时,您将打开的编写器传递给 Transformer(在StAXResult中),它将输出写入现有命名空间声明的上下文,并且不会添加额外的冗余声明。

于 2013-10-14T09:17:43.247 回答
0

好吧,我想这里的每个人都是正确的。出于我的目的,字符串操作有效。但是我学到了更多关于 xslt 和命名空间的知识。谢谢大家。

于 2013-10-19T08:17:20.413 回答
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 是关于数据的——不是化妆品!

于 2013-10-14T07:36:11.997 回答
0

XSLT 不能生成名称空间格式不正确的输出。

于 2013-10-14T09:50:14.550 回答