php, xml, xpath, xslt 이용하기

lacovnk의 이미지

xml 문서의 특정 노드에 대해서만 xslt를 적용하려 합니다.
(동적으로 생성해야 하므로, xslt 내에서 xquery 를 박아넣을 수는 없습니다;)

... 그런데 검색된 부분이 아니라 자꾸 전체 문서에 대해서 변환되네요.

php5 입니다.

아, 그리고 xml 에 get parameter를 넘겨주면 xslt로만 해결할 수는 없나요? (예를 들면 와우 전정실같은 형태) 어차피 중간에 처리해주는 부분이 들어가야하는건가..

// 1. 검색할 xml 문서 만들고

$xmlObj = new DOMDocument;
$xmlObj->loadxml($xml_content);

// 2. xpath로 해당 노드를 찾았음
$xpath = new DOMXPath($xmlObj);
$query = "/bar[@id='bar']";
$entries = $xpath->query($query);
$qres = $entries->item(0);

// 3. 변환을 위한 xslt processor 생성
$proc = new XSLTProcessor;
$proc->importStyleSheet(DOMDocument::loadxml($xslt_content));

// 4. 이후 해당 노드에 대해서만 xslt 적용
$result = $proc->transformToDoc($qres);

lacovnk의 이미지

왜 저렇게 안되는지 모르겠지만, 다음과 같이 중간에 XML string을 생성해서 해결했습니다.

$xml_str = file_get_contents('foo.xml');
$xslt_str = file_get_contents('foo.xsl');
$xpath_query = "foo[@id='bar']";
 
$node_str = _find_node($xml_str, $xpath_query);
print _apply_xslt($node_str, $xslt_str);
 
 
function _apply_xslt($xml_str, $xslt_str)
{
  $xslt_proc = new XSLTProcessor;
  $xslt_proc->importStyleSheet(DOMDocument::loadxml($xslt_str));
 
  $result = $xslt_proc->transformToDoc(DOMDocument::loadXML($xml_str));
  if($result != false){return $result->saveHTML();}
  else {return "Transformatin Failed";}
}
 
function _find_node($xml_str, $xpath_query)
{
  $xml = new DOMDocument;
  $xml->loadxml($xml_str);
 
  $xpath = new DOMXPath($xml);
  $entries = $xpath->query($xpath_query);
  $qres = $entries->item(0);
  return $xml->saveXML($qres);
}