【问题标题】:disable-output-escaping broken with libxslt library on MacOS Catalina禁用输出转义在 MacOS Catalina 上被 libxslt 库破坏
【发布时间】:2020-07-21 01:51:53
【问题描述】:

升级到 MacOS Catalina 并链接到 10.15 SDK 中包含的 libxslt 和 libxml2 后,一个奇怪的问题是 disable-output-escaping="yes" 的所有使用都被破坏并且无论如何都会逃避输出。来自各种 XSLT 工作表的几个示例:

<xsl:text disable-output-escaping="yes">&lt;--test comment--&gt;</xsl:text>
<xsl:value-of select="/*[1]/LBL_CM_3" disable-output-escaping="yes" />

LBL_CM_3 节点中有一些 HTML,例如cm&lt;sup&gt;3&lt;/sup&gt;。当我的代码使用非常直接的 API 处理时,这两种情况都被转义(意外结果)。这是一个精简的版本,省略了错误检查和清理:

    xmlDocPtr tmpXmlDoc = xmlParseMemory(inputString.c_str(), (int)inputString.size());
    xmlDocPtr tmpXslDoc = xmlParseMemory(xslInputStr, xslInputStrSize);
    xsltStylesheetPtr tmpXslStyleSheet = xsltParseStylesheetDoc(tmpXslDoc);
    xmlDocPtr tmpHtmlDoc = xsltApplyStylesheet(tmpXslStyleSheet, tmpXmlDoc, params);

但是,如果我使用 /usr/bin/xsltproc 处理相同的输入和样式表,则输出不会被转义(预期结果)。我们都链接系统上的同一个库:

$ otool -L /usr/bin/xsltproc | grep -E 'xml|xslt'
/usr/bin/xsltproc:
    /usr/lib/libexslt.0.dylib (compatibility version 9.0.0, current version 9.15.0)
    /usr/lib/libxslt.1.dylib (compatibility version 3.0.0, current version 3.26.0)
    /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)
$ otool -L TestXslt.app/Contents/MacOS/TestXslt | grep -E 'xml|xslt'
    /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)
    /usr/lib/libexslt.0.dylib (compatibility version 9.0.0, current version 9.15.0)
    /usr/lib/libxslt.1.dylib (compatibility version 3.0.0, current version 3.26.0)

系统xsltproc版本信息:

$ /usr/bin/xsltproc --version
Using libxml 20904, libxslt 10129 and libexslt 817
xsltproc was compiled against libxml 20904, libxslt 10129 and libexslt 817
libxslt 10129 was compiled against libxml 20904
libexslt 817 was compiled against libxml 20904

10.15 SDK usr/include/libxml/xmlversion.h 显示相同版本:

/**
 * LIBXML_DOTTED_VERSION:
 *
 * the version string like "1.2.3"
 */
#define LIBXML_DOTTED_VERSION "2.9.4"

/**
 * LIBXML_VERSION:
 *
 * the version number: 1.2.3 value is 10203
 */
#define LIBXML_VERSION 20904

这与之前使用 MacOS Sierra SDK 的预期效果一样,具有相同的调用代码和相同的 XSLT 工作表。 XSLT 处理的所有其余部分似乎都按预期工作,只有 disable-output-escaping="yes" 被忽略。

【问题讨论】:

  • 并不真正相关,但禁用输出转义应该是最后的手段,并且使用它代替 xsl:comment 来输出评论,就像在你的第一个例子中一样,是非常糟糕的编码实践。它甚至没有正确的评论标记。
  • @MichaelKay 很公平,但它是一个遗留代码库。在意识到问题是系统性的之前,我已经手动修复了许多地方。

标签: xml macos macos-catalina libxslt


【解决方案1】:

结果证明这是由来自另一个依赖项的 libxml2libxslt 的冲突版本的混合链接引起的。系统版本:

libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)
libxslt.1.dylib (compatibility version 3.0.0, current version 3.26.0)

预构建 Postgres 12 的捆绑版本:

libxml2.2.dylib (compatibility version 12.0.0, current version 12.4.0)
libxslt.1.dylib (compatibility version 3.0.0, current version 3.29.0)

如果你得到例如来自 Postgres 的 libxml2 和来自系统的 libxslt,然后它主要工作但 disable-output-escaping 神秘地中断。如果您使用任一对(两个系统,或都与 Postgres 捆绑),则 disable-output-escaping 有效。您必须考虑链接器顺序(例如,如果存在多个版本,则由 otool -L 报告。

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多