XSL生成混合xml /文本输出

时间:2014-05-14 14:25:12

标签: xml xslt namespaces

我想做类似的问题: how to include the node XML in my XSLT text output? 或者,很快解释:

  • 输入是XML
  • 使用XSL转换为不同的语法(非XML)
  • 将XML子树逐字复制到输出

上面引用的主题中提供的两个选项都很有意思,但不起作用,因为我的输入XML doc使用(可能是多个)命名空间,并且:

  • 使用xsl:output = text(回答2)时,输入XML的命名空间将丢失。我可以使用name()而不是local-name(),但仍然缺少名称空间声明。有没有一种很好的方法来收集引用的命名空间声明并插入它们?
  • 如果我使用xsl:output = xml方式(回答1),我在生成的XML中正确获取名称空间,但是我不知何故需要转义XML属性的引号 - 任何想法如何做到这一点? / LI>
  • 解决方案1的另一个问题是,如果XML特殊字符如& amp; amp;在输入XML中,然后文本输出仍将它们作为& amp; (这当然是正确的但不是我需要的)

示例:

<bla:Library xmlns:bla="ns1" xmlns:blub="ns2">
  <blub:Book id="123">
    <Title>Python Does Everythig &amp; more</Title>
    <Author>Smith</Author>
  </Book>
...

并且,与原始帖子不同,结果应该是(注意&amp;的引用和处理)。并且,是的,在我的情况下输出语法是不同的(不是与DB相关,因此我需要原始XML输出周围的引号),但要坚持原始示例...:

Python Does Everything & more|Smith|"<bla:Book xmlns:bla=\"ns1\" xmlns:blub=\"ns2\" id=\"123\"><blub:Title>Python Does Everythig &amp; more</Title>Author>Smith</Author></Book>"

好像这很不可能,但也许有人知道一个很好的伎俩... :-) 问候,   TGE

1 个答案:

答案 0 :(得分:0)

使用标准XSL我找不到这样做的方法,但是我使用了创建扩展模块的可能性(在我的情况下使用libxslt - 但似乎是标准的XSL),它进行转换。 所以,我的XSL现在看起来像这样:

<xsl:stylesheet version="1.0" ...
     xmlns:tge="http://xmlsoft.org/xslt/tgeplugin"
     extension-element-prefixes="tge">
...
<xsl:for-each select="bla:Book">
  <xsl:text> "</xsl:text><tge:tgeplugin select="."/><xsl:text>"</xsl:text>
</xsl:for-each>

我的扩展插件实现&#34; tgeplugin&#34; (参见libxslt示例如何做到这一点)。在那里,我使用了一些libxml2函数来有效地生成一个新的XML标签&#34;&lt; text&gt;&#34;包含实际输入XML作为文本值(带引号转义)。

不是标准的XSL,但对于我的问题可能是最不丑的方式: - )