1

我需要将内容存储在 xml 数据库中。数据库中的一些数据如下所示:

<item>
    <span class ="person">Henry 8<sup>th</sup></span>
</item>

<item>
    <span class="company">Berkley & Jensen</span>
</item>

我需要将数据加载到 dom 对象中,loadXML()然后将其传递给 xsl 样式表,在该样式表中使用 xpath 和 css 对其进行进一步操作。当我加载数据时,代码会因为“&”而中断,并且我不想转换所有实体,因为我需要<sup>在“类”上使用 css 和 xpath,并且我怀疑编码实体会导致它们失败。我应该如何存储和检索非法字符?

由于评论,我提供了一个示例 php 脚本。如果您添加它应该运行的 php 标签。感谢您的 CDATA 建议。我用它来演示这个问题。如果我尝试使用“块”标签作为 XPATH 的目标,它可以正常工作,但如果我尝试使用“跨度”标签,它不会打印任何内容。

$xsl = <<<XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="doContent" match="/">

<div class="story">
  <xsl:for-each select="//body/block">     <xsl:copy-of select="." />
  </xsl:for-each>
</div>

</xsl:template>

</xsl:stylesheet>     
XSL;

$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<content id="test" >
  <headline>test</headline>
  <author>test</author>
  <body>
    <block id="1"><![CDATA[<span class="normal"><p>1</p></span>]]></block>
    <block id="2"><![CDATA[<span class=""><p>2</p></span>]]></block>
    <block id="3"><![CDATA[<span class ="person">Henry 8<sup>th</sup></span>]]></block>
    <block id="4"><![CDATA[<span class="company">Berkley & Jensen</span>]]></block>
    <block id="5"><![CDATA[<span class=""><p>5</p></span>]]></block>
    <block id="6"><![CDATA[<span class=""><p>6</p></span>]]></block>
  </body>
</content>
XML;

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

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

   $proc = new XSLTProcessor();
   $proc->importStylesheet($xslDoc);
   echo $proc->transformToXML($xmlDoc);
4

2 回答 2

0

将其包装成<![CDATA[]]>

<item>
    <![CDATA[<span class="company">Berkley & Jensen</span>]]>
</item>

有关 CDATA 的更多信息:XML 中的 <![CDATA[]]> 是什么意思?

于 2013-11-07T09:11:40.370 回答
0

我能够使用我创建的用于清理不需要的字符的功能来解决我的情况。您可以使用我上面提供的示例 xml 进行尝试。请注意,我使用 loadHTML 而不是 loadXML!

function clean_invalid_nodes(&$node)
{
  global $xpath, $xmlDoc;
  $nodes = $xpath->query("child::node()",$node);
  foreach ($nodes as $n) 
  {
    if ($n->nodeType == XML_ELEMENT_NODE) clean_invalid_nodes($n);
    elseif ($n->nodeType == XML_TEXT_NODE) 
    {
      if(trim($n->nodeValue)!='')
      { 
        $newnode = $xml->createTextNode(htmlentities($xmlDoc ->saveXML($n), ENT_SUBSTITUTE, 'utf-8'));
        $n->parentNode->replaceChild($newenode, $n);
      }
    }
  }
}

$xmlDoc = new DOMDocument();
@$xmlDoc->loadHTML($xml);
$xpath = new DomXPath($xmlDoc);

$nodes = $xpath->query("//span");
foreach ($nodes as $node)  clean_invalid_nodes($node);
$out = $xpath->query("//html/body")->item(0);
echo $xmlDoc ->saveXML($out);
于 2013-11-13T00:19:28.200 回答