4

XML ドキュメント内のテキストを一致させるために使用<xsl:template match="m:*/text()">しています。これは、プレーン テキストと既知のエンティティに対して正常に機能します。つまり、 のようなエンティティ&amp;や Unicode エンティティに対して正常に機能し&#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>

変数は 3 回出力される$contentはずですが、出力されるのは 3 回だけ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