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);
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.