与xsltproc

时间:2018-11-29 07:24:25

标签: xml xslt xslt-1.0 libxml2 libxslt

我正在使用libxslt(加上libxml2,libexslt)进行XSLT处理。
首先,我使用如下所示的XML输入文件并使用MS Office的XSL文件(APASixthEditionOfficeOnline.xsl)对xsltproc进行了XSLT处理。您可以看到如下所示的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>

xsltproc的XML输出

  • 我在命令行中编写了以下代码。

      

    xsltproc APASixthEditionOfficeOnline.xsl input.xml> output.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的相同结果。
您能找出我的代码问题吗?
这对您的评论很有帮助。
谢谢。

1 个答案:

答案 0 :(得分:0)

由于XSLT转换的结果并不总是格式正确的文档,并且依赖于xsl:output,因此您必须使用xsltSaveResultTo函数之一来输出结果。