将转换应用于包含转义HTML的XML属性

时间:2014-11-19 13:37:04

标签: xml xslt

我有一些看起来像这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <issue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <comment text="&lt;div class=&quot;wiki text&quot;&gt;&lt;h4&gt;Tom Fenech&lt;/h4&gt;Here is a comment&lt;/div&gt;&#10;"/>
    </issue>
</root>

如您所见,text节点中的comment属性包含转义的HTML。我想将属性的内容作为XHTML获取,我目前在模板中使用:

进行此操作
<xsl:value-of select="@text" disable-output-escaping="yes" />

这让我得到了最终输出中的HTML:

<div class="wiki text"><h4>Tom Fenech</h4>Here is a comment</div>

但我希望能够提取<h4>标记的内容以便在其他地方使用。一般来说,一旦它被转义就能够操纵它的内容会很好。

如何将其他模板应用于<xsl:value-of />的输出?

我目前正在使用支持XSLT版本1.0的PHP built-in XSLT processor,但如果新版本的功能可以实现这一点,我愿意考虑使用替代处理器。

2 个答案:

答案 0 :(得分:1)

您无法将模板应用于未解析(转义或CDATA)文本。查看以前可能与您相关的一些答案:

Parsing html with xslt

XSLT: Reading a param that's an xml document passed as a string

how to parse the xml inside CDATA of another xml using xslt?

答案 1 :(得分:1)

这是通过从XSLT调用PHP函数来实现它的一种方法:

function parseHTMLString($html)
{
    $doc = new DOMDocument();
    $doc->loadHTML($html);
    return $doc;
}

$xml = <<<EOB
<root>
    <issue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <comment text="&lt;div class=&quot;wiki text&quot;&gt;&lt;h4&gt;Tom Fenech&lt;/h4&gt;Here is a comment&lt;/div&gt;&#10;"/>
    </issue>
</root>
EOB;

$xsl = <<<EOB
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:php="http://php.net/xsl"
     xsl:extension-element-prefixes="php">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
 <xsl:template match="comment">
   <xsl:apply-templates select="php:functionString('parseHTMLString', @text)//div/h4"/>
 </xsl:template>

 <xsl:template match="div/h4">
   <h2><xsl:apply-templates/></h2>
 </xsl:template>
</xsl:stylesheet>
EOB;

$xmldoc = new DOMDocument();
$xmldoc->loadXML($xml);

$xsldoc = new DOMDocument();
$xsldoc->loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions('parseHTMLString');
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);