【问题标题】:XSL to produce mixed xml/text outputXSL 产生混合的 xml/文本输出
【发布时间】:2014-05-14 14:25:11
【问题描述】:

我想做类似这里问的事情: how to include the node XML in my XSLT text output? 或者,简要说明:

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

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

  • 使用 xsl:output=text(答案 2)时,输入 XML 的命名空间会丢失。我可以使用 name() 而不是 local-name() 但仍然缺少命名空间声明。有没有一种收集引用的命名空间声明并插入它们的好方法?
  • 如果我使用 xsl:output=xml 方式(答案 1),我可以正确获取生成的 XML 中的命名空间,但是我需要以某种方式转义 XML 属性的引号 - 知道该怎么做吗?
  • 解决方案 1 的另一个问题是,如果 XML 特殊字符(如 &位于输入 XML 中,则文本输出仍为 & (这当然是正确的,但不是我需要的)

例子:

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

并且,与原始帖子不同,结果应为(注意&的引用和处理)。而且,是的,在我的情况下输出语法是不同的(与 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>"

似乎这是不可能的,但也许有人知道一个不错的技巧...... :-) 问候, 哥们

【问题讨论】:

  • “似乎这完全不可能。” 确实如此。 “看起来像 XML,但所有双引号都被转义的东西”不是 XSLT 处理器实现的输出模式。您仍然可以使用 XSLT 创建 XML 位,但您必须使用更高层(即包含 XSLT 处理器的宿主语言)来组合您的自定义输出格式。

标签: xml xslt namespaces


【解决方案1】:

使用标准 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>

并且我的扩展插件实现了“tgeplugin”(参见 libxslt 示例如何做到这一点)。在那里,我使用了一些 libxml2 函数来有效地生成一个新的 XML 标记“”,其中包含作为文本值的实际输入 XML(引号已转义)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多