Другой результат обработки XSLT по сравнению с xsltproc - PullRequest
0 голосов
/ 29 ноября 2018

Я выполняю XSLT-обработку с помощью libxslt (плюс libxml2, libexslt).
Сначала я выполнил свою обработку XSLT с помощью xsltproc, используя входной XML-файл, как показано ниже, и используя XSL-файл MS Office (APASixthEditionOfficeOnline.xsl),Вы можете увидеть вывод 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

  • Я написал приведенный ниже код в командной строке.

    xsltprocAPASixthEditionOfficeOnline.xsl input.xml> output.xml

  • И я получил текст в output.xml
    APA


Тем временем я попытался создать собственный xsltproc, реализовав функции libxml2 и libxslt.

Я использовал тот же файл 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 голосов
/ 29 ноября 2018

Поскольку результат преобразования XSLT не всегда является правильно сформированным документом и зависит от xsl:output, для вывода результата необходимо использовать одну из функций xsltSaveResultTo.

...