我想知道是否可以转换此XML
<url name="profile_link">http://example.com/profile/2345/</url>
进入此HTML
<a href="http://example.com/profile/2345/">http://example.com/profile/2345/</a>
我不明白如何填充链接中的href。可以通过xml_set_character_data_handler()访问URL(即数据内容),但是在触发该事件之前已经调用了启动处理程序(与锚交换url)。
答案 0 :(得分:1)
以下是两种方法:
更换节点需要较少的引导程序。它完全在PHP中完成。
$xml = <<<'XML'
<url name="profile_link">http://example.com/profile/2345/</url>
XML;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$nodes = $xpath->evaluate('//url');
foreach ($nodes as $node) {
$link = $dom->createElement('a');
$link->appendChild($dom->createTextNode($node->textContent));
$link->setAttribute('href', $node->textContent);
$node->parentNode->insertBefore($link, $node);
$node->parentNode->removeChild($node);
}
var_dump($dom->saveXml($dom->documentElement));
第二种方法需要XSLT模板文件。 XSLT是一种用于转换XML的语言。因此,初始引导程序更大,但实际转换更容易定义。如果你还需要进行其他转换,我会建议这种方法。
$xml = <<<'XML'
<url name="profile_link">http://example.com/profile/2345/</url>
XML;
$xsl = <<<'XSL'
<?xml version="1.0"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="url">
<a href="text()">
<xsl:value-of select="text()"/>
</a>
</xsl:template>
<!-- pass through for unknown tags in the xml tree -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XSL;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xslDom = new DOMDocument();
$xslDom->loadXml($xsl);
$xsltProc = new XsltProcessor();
$xsltProc->importStylesheet($xslDom);
$result = $xsltProc->transformToDoc($dom);
var_dump($result->saveXml($result->documentElement));