こんにちは、lib xsltproc を使用して、現在のプロジェクトの古い xml、xls ファイルのセットを変換しています。ツールを使用してプロジェクトを変換しようとすると、次のエラーが発生します。
Warning: xmlXPathCompOpEval: function testFunc not found
XPath error : Unregistered function
runtime error: file test.xsl line 25 element value-of
XPath evaluation returned no result.
ファイルのインポートを検索したところ、CDATA タグにこの関数を含むインポートがあることがわかりました。インポートされたファイルは次のようになります。
<!-- importMe.xsl -->
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet >
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://www.test.se/test">
<msxsl:script language="JavaScript" implements-prefix="user">
<![CDATA[
function testFunc(str){
return str;
}
]]>
</msxsl:script>
</xsl:stylesheet>
そのファイルをインポートするファイルは次のようになります。
<!-- testImport.xsl -->
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://www.test.se/test">
<xsl:import href="importMe.xsl"/>
<xsl:output method="html" encoding="utf-8"/>
<msxsl:script language="JavaScript" implements-prefix="user">
function someFunc(value) {
return "";
}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:testFunc('')"/>
<HTML>
<HEAD>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
簡潔にするため、また問題の一部ではないように思われるため、xml ファイルは含めませんでした。
何が起こっているように見えるのは、変換で CDATA が削除されないことです。importMe.xsl ファイルの名前を変更しようとしましたが、ファイルが見つからないという別のエラー メッセージが表示されたので、ファイルがインポートされていることはほぼ確実です。
CDATA が消えるのを防ぐ方法はありますか?
さまざまな組み合わせで両方のファイルに次の行を追加しようとしました
<xsl:output method="html" encoding="utf-8" cdata-section-elements="msxsl:script"/>
との両方method="html"
を使用し、"xml"
異なる cdata-section-elements も使用します。