如果这是在这里已经彻底讨论过的话,我道歉。我花了很多时间寻找答案,似乎无法挖掘出明确的答案。此外,在PHP方面,我几乎都是业余爱好者。
我有一个XML文档,我正在尝试使用PHP呈现为HTML。 XML实际上“理论上”用于单一来源,这意味着希望将其用作生成PDF和HTML输出的源。因此,XML实际上由作为手册部分的元素组成。见下文:
<topic>
<title>Some topic.</title>
<caution>
<para>Cautionary note 1.</para>
</caution>
<para>Paragraph 1</para>
<caution>
<para>Cautionary note 2.</para>
</caution>
<para>Paragraph 2</para>
<figure>
<graphic src="../some_path"/>
</figure>
</topic>
对于PDF,我打算编写一个XSLT转换。对于HTML,我有一个脚本可以成功地将XML的所有元素转换为HTML。问题是,它似乎是将XML转换为已解析的数组。上面的示例使用(使用HTML等效项)渲染:
因此,不保留文档顺序。由于此源用于组合手册,因此文档顺序很重要。
我的问题:是否可以使用PHP将XML解析为HTML并保留文档顺序?再说一次,我几乎是一个PHP爱好者,所以如果我的问题看起来很迟钝,我会道歉。欢迎任何建议或指示。
编辑添加一些PHP
PHP脚本非常冗长,所以我将尝试尽可能多地包含相关位。
就注意事项而言,脚本最初定义了一个函数:
//Display the cautions from the xml
function display_cautions($cautions)
{
foreach( $cautions as $caution )
{
foreach( $caution->para as $cautionpara )
{
printf("<p class='Text'>");
foreach( $cautionpara->{'attention-icon'} as $attentionicon )
{
printf("<img src='../../images/%s' width='25px' height='25px'>", htmlspecialchars($attentionicon['srcfile']));
}
$cautionpara = str_ireplace('<emph>', '<b>', $cautionpara);
$cautionpara = str_ireplace('</emph>', '</b>', $cautionpara);
printf("%s</p>", htmlspecialchars($cautionpara));
}
}
}
然后构建文档:
if (isset($_GET['ID']))
{
$introsections = $doc->{'intro-section'};
//printf("got here 1");
foreach( $introsections as $introsection )
{
//printf("got here 2");
$sectno = $introsection['sect-no'];
if ($sectno == $_GET['ID'])
{
$smtitle = $introsection->title->nodeValue;
$introgenerals = $introsection->{'intro-general'};
foreach( $introgenerals as $introgeneral )
{
//printf("got here 3");
$smtitle = $introgeneral->title;
$introid = $introgeneral['id'];
//Display the title
printf("<h2>%s</h2>", htmlspecialchars($smtitle));
//Match found
$topics = $introgeneral->topic;
foreach( $topics as $topic )
{
//Display the title
printf("<p class='Text12Bold'>%s</p>", htmlspecialchars($topic->title));
$topicparas = $topic->para;
//Get all the paragraphs
foreach( $topicparas as $topicpara )
{
//MH added: code to include xrefs here
//check for xrefs in this para
$xrefs = $topicpara->xref;
if (simple_xml_count($xrefs) > 0) {
//printf("<p class='Text'>%s</p>\n", htmlspecialchars($topicpara));
display_referral_links($xrefs, $topicpara);
} else {
$topicpara = str_ireplace('<emph>', '<b>', $topicpara);
$topicpara = str_ireplace('</emph>', '</b>', $topicpara);
?>
<p class='Text'><?php printf($topicpara) ?></p>
<?php
}
}
然后它调用警告功能:
//Get all the cautions with images where applicable
display_cautions($topic->caution);
在文档构造和函数调用之间,它构造表,子主题和图形。警告,备注和列表也有类似的功能。