libxslt(プラスlibxml2、libexslt)でXSLT処理をしています。まず、以下のようなXML入力ファイルとMS OfficeのXSLファイル(APASixthEditionOfficeOnline.xsl)を使っ
てXSLT処理を行いました。xsltproc
以下のような XML 出力を確認できます。
XML 入力 (input.xml)
<?xml version="1.0"?>
<b:StyleNameLocalized xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography">
<b:Lcid>1042</b:Lcid>
</b:StyleNameLocalized>`
XSL スタイルシート (APASixthEditionOfficeOnline.xsl)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography">
<xsl:output method="html" encoding="us-ascii"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="b:StyleNameLocalized">
<xsl:choose>
<xsl:when test="b:StyleNameLocalized/b:Lcid='1042'">
<xsl:text>APA</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
による XML 出力xsltproc
コマンドラインに以下のコードを書きました。
xsltproc APASixthEditionOfficeOnline.xsl 入力.xml > 出力.xml
そして、output.xml
APAにテキストを取得しました
そんな中、libxml2とlibxsltの機能を実装してxsltprocを自作してみました。
同じ APASixthEditionOfficeOnline.xsl ファイルを使用しましたが、input.xml を解析せず、コードで XmlDocPtr を生成しました。以下は私のコードです。
マイコード
const xmlChar* stylesheetfile = (const xmlChar*)"APASixthEditionOfficeOnline.xsl";
xsltStylesheetPtr style = xsltParseStylesheetFile(xslfile);
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "b:StyleNameLocalized");
xmlNsPtr ns =
xmlNewNs(root_node,
BAD_CAST "http://schemas.openxmlformats.org/officeDocument/2006/bibliography",
BAD_CAST "b");
xmlDocSetRootElement(doc, root_node);
xmlNewChild(root_node, ns, BAD_CAST "Lcid", BAD_CAST "1042");
xmlDocPtr output = xsltApplyStylesheet(style, doc, 0);
mlChar* xmlData;
int size;
xmlDocDumpMemory(output, &xmlData, &size);
変数の期待値xmlData
は「APA」ですが、この結果になりました。
私の結果
<?xml version="1.0" encoding="us-ascii" standalone="yes"?>
xsltproc と同じ結果が必要です。
私のコードの問題を理解できますか?
ご意見本当に参考になります。
ありがとうございました。