使用 text() 匹配 XSLT 中的自定义实体名称
Using text() to match custom entity names in XSLT
我正在使用 <xsl:template match="m:*/text()">
来匹配我的 XML 文档中的文本,它适用于纯文本和已知实体,即适用于 &
或 unicode 等实体π
.
等实体
然而,匹配自定义实体名称不起作用。例如,我的 XML 文档中有一个实体 π
,应该使用 text()
进行匹配。出于某种原因,它不会将该实体视为文本,这意味着没有任何匹配项。
请注意,我确实在 XML 文档和 XSLT 文档的 Doctype 声明中声明了实体名称:
<!DOCTYPE xsl:stylesheet [<!ENTITY pi "π">]>
text()
是匹配自定义实体名称的正确方法,还是我需要使用其他函数? (也许我声明实体名称也做错了?)
谢谢
编辑
XML
<!DOCTYPE mathml [<!ENTITY pi "π">]>
<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">
<mi>π</mi>
<mi>test</mi>
<mi>π</mi>
</math>
XSLT
<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [<!ENTITY pi "π">]>
<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
和 π
。
使用PHP
处理
$xslDoc = new DOMDocument();
$xslDoc->load("doc.xsl");
$xslProcessor = new \XSLTProcessor();
$xslProcessor->importStylesheet($xslDoc);
$mathMLDoc = new DOMDocument();
$mathMLDoc->loadXML('<!DOCTYPE mathml [<!ENTITY pi "π">]><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>π</mi><mi>test</mi><mi>π</mi></math>');
echo $xslProcessor->transformToXML($mathMLDoc);
据我所知,问题在于 DTD 对于 XSLT 样式表不可见。在转换文档之前使用以下内容将实体替换为其文本值:
$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 "π">]><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>π</mi><mi>test</mi><mi>π</mi></math>');
echo $xslProcessor->transformToXML($mathMLDoc);
这将产生
<?xml version="1.0"?>
πtestπ
一些背景:http://php.net/manual/en/xsltprocessor.transformtoxml.php#99932 and http://hublog.hubmed.org/archives/001854.html。
我正在使用 <xsl:template match="m:*/text()">
来匹配我的 XML 文档中的文本,它适用于纯文本和已知实体,即适用于 &
或 unicode 等实体π
.
然而,匹配自定义实体名称不起作用。例如,我的 XML 文档中有一个实体 π
,应该使用 text()
进行匹配。出于某种原因,它不会将该实体视为文本,这意味着没有任何匹配项。
请注意,我确实在 XML 文档和 XSLT 文档的 Doctype 声明中声明了实体名称:
<!DOCTYPE xsl:stylesheet [<!ENTITY pi "π">]>
text()
是匹配自定义实体名称的正确方法,还是我需要使用其他函数? (也许我声明实体名称也做错了?)
谢谢
编辑
XML
<!DOCTYPE mathml [<!ENTITY pi "π">]>
<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">
<mi>π</mi>
<mi>test</mi>
<mi>π</mi>
</math>
XSLT
<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [<!ENTITY pi "π">]>
<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
和 π
。
使用PHP
处理$xslDoc = new DOMDocument();
$xslDoc->load("doc.xsl");
$xslProcessor = new \XSLTProcessor();
$xslProcessor->importStylesheet($xslDoc);
$mathMLDoc = new DOMDocument();
$mathMLDoc->loadXML('<!DOCTYPE mathml [<!ENTITY pi "π">]><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>π</mi><mi>test</mi><mi>π</mi></math>');
echo $xslProcessor->transformToXML($mathMLDoc);
据我所知,问题在于 DTD 对于 XSLT 样式表不可见。在转换文档之前使用以下内容将实体替换为其文本值:
$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 "π">]><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>π</mi><mi>test</mi><mi>π</mi></math>');
echo $xslProcessor->transformToXML($mathMLDoc);
这将产生
<?xml version="1.0"?>
πtestπ
一些背景:http://php.net/manual/en/xsltprocessor.transformtoxml.php#99932 and http://hublog.hubmed.org/archives/001854.html。