4

我正在使用<xsl:template match="m:*/text()">匹配我的 XML 文档中的文本,它适用于纯文本和已知实体,即它适用于&amp;&#x003C0;.

但是,不起作用的是匹配自定义实体名称。例如&pi;,我的 XML 文档中有一个实体,应该使用text(). 由于某种原因,它不会将该实体视为文本,这意味着没有任何内容被匹配。

请注意,我确实在 XML 文档和 XSLT 文档的 Doctype 声明中声明了实体名称:

<!DOCTYPE xsl:stylesheet [<!ENTITY pi "&#x003C0;">]>

匹配自定义实体名称的正确方法是text(),还是我需要使用其他函数?(也许我在声明实体名称时也做错了什么?)

谢谢

编辑

XML

<!DOCTYPE mathml [<!ENTITY pi "&#x003C0;">]>
<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">    
    <mi>&pi;</mi>
    <mi>test</mi>
    <mi>&#x003C0;</mi>
</math>

XSLT

<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [<!ENTITY pi "&#x003C0;">]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:m="http://www.w3.org/1998/Math/MathML"
                version='1.0'>

    <xsl:template match="m:*/text()">
        <xsl:call-template name="replaceEntities">
            <xsl:with-param name="content" select="normalize-space()"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="replaceEntities">
        <xsl:param name="content"/>
        <xsl:value-of select="$content"/>
    </xsl:template>
</xsl:stylesheet>

变量$content应该被打印三次,但是只有test&#x003C0;被打印。

使用 PHP 处理

$xslDoc = new DOMDocument();
$xslDoc->load("doc.xsl");
$xslProcessor = new \XSLTProcessor();
$xslProcessor->importStylesheet($xslDoc);
$mathMLDoc = new DOMDocument();
$mathMLDoc->loadXML('<!DOCTYPE mathml [<!ENTITY pi "&#x003C0;">]><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>&pi;</mi><mi>test</mi><mi>&#x003C0;</mi></math>');
echo $xslProcessor->transformToXML($mathMLDoc);
4

1 回答 1

4

据我所知,问题在于 XSLT 样式表看不到 DTD。在转换文档之前,使用以下内容将实体替换为其文本值:

$mathMLDoc->substituteEntities = true;

如在

$xslDoc = new DOMDocument();
$xslDoc->load("tree.xsl");
$xslProcessor = new \XSLTProcessor();
$xslProcessor->importStylesheet($xslDoc);
$mathMLDoc = new DOMDocument();
$mathMLDoc->substituteEntities = true;
$mathMLDoc->loadXML('<!DOCTYPE math [<!ENTITY pi "&#x003C0;">]><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>&pi;</mi><mi>test</mi><mi>&#x003C0;</mi></math>');
echo $xslProcessor->transformToXML($mathMLDoc);

这将产生

<?xml version="1.0"?>
πtestπ

一些背景:http://php.net/manual/en/xsltprocessor.transformtoxml.php#99932http://hublog.hubmed.org/archives/001854.html

于 2015-04-20T14:43:21.023 回答