升级到MacOS Catalina并链接到10.15 SDK中包含的libxslt和libxml2后,一个奇怪的问题是disable-output-escaping="yes"
的所有使用都已中断,并且无论如何都会退出输出。来自各种XSLT表单的几个示例:
<xsl:text disable-output-escaping="yes"><--test comment--></xsl:text>
<xsl:value-of select="/*[1]/LBL_CM_3" disable-output-escaping="yes" />
其中LBL_CM_3
节点中有一些HTML,例如cm<sup>3</sup>
。当我的代码使用非常直接的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 SDKusr/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
这与之前使用MacOSSierra SDK时预期的一样,具有相同的调用代码和相同的XSLT表。XSLT处理的所有其余部分似乎都按预期工作,只有disable-output-escaping="yes"
被忽略。
这是由来自另一个依赖项的libxml2
和libxslt
的冲突版本的混合链接引起的。系统版本:
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)
与预建Postgres12:的捆绑版本
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
所报告。