簡體   English   中英

XSLTProcessor問題

[英]XSLTProcessor issues

我的XSLT樣式表具有以下XML(請注意table-number參數:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tet="http://www.pdflib.com/XML/TET3/TET-3.0">
    <xsl:output method="text" />
    <xsl:param name="table-number" select="1" />
    <xsl:param name="page-number" select="0" />
    <xsl:param name="separator-char" select="','" />
    <xsl:variable name="double-quote">"</xsl:variable>

    <xsl:template match="/">
        <xsl:if test="tet:TET/tet:Document/tet:Pages/tet:Page/tet:Content[not(@granularity = 'word' or @granularity = 'page')]">
            <xsl:message terminate="yes">
                <xsl:text>Stylesheet table.xsl processing TETML for document '</xsl:text>
                <xsl:value-of select="tet:TET/tet:Document/@filename" />
                <xsl:text>': this stylesheet requires word info in TETML.</xsl:text>
                <xsl:text>Create the input in page mode "word" or "wordplus".</xsl:text>
            </xsl:message>
        </xsl:if>

        <xsl:choose>
            <xsl:when test="$page-number = 0">
                <xsl:variable name="table" select="(tet:TET/tet:Document/tet:Pages/tet:Page//tet:Table)[$table-number]"/>
                <xsl:if test="count($table) = 0">
                    <xsl:call-template name="table-not-found" />
                </xsl:if>
                <xsl:apply-templates select="$table" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="table" select="(tet:TET/tet:Document/tet:Pages/tet:Page[@number = $page-number]//tet:Table)[$table-number]"/>
                <xsl:if test="count($table) = 0">
                    <xsl:call-template name="table-not-found" />
                </xsl:if>
                <xsl:apply-templates select="$table" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    .
    .
    .
</stylesheet>

下面的PHP代碼在給定的XML輸入文件上執行XSLT:

protected function tetml_to_csv() {
    $processor = new XSLTProcessor();

    $xsl = new DOMDocument();
    $xsl->load(realpath('./path/to/xslt/tetml_to_csv.xsl'), LIBXML_NOCDATA);

    $processor->importStylesheet($xsl);

    $tetml = file_get_contents($this->tetmlDoc);

    $tetml = new DOMDocument();
    $tetml->load($this->tetmlDoc);

    //var_dump($processor->getParameter('xsl', 'table-number'));
    //exit();
    $processor->setParameter(NULL, 'table-number', 1);

    file_put_contents($this->filepath . 'output.csv',  $processor->transformToXml($tetml));

    unlink($this->tetmlDoc);
}

當我運行代碼而不調用setParameter() ,XSLT僅將輸入XML中的第一個表放到輸出.csv文件中(這是預期的行為)。

但是,當我在執行轉換之前調用setParameter()時,即使我將參數的值設置為默認值,來自輸入XML文件的所有表也​​會轉移到輸出.csv文件。

當我調用getParameter()該函數返回false (即使返回值應該是參數的值,如果找不到該參數,則返回null )。

我嘗試更改傳遞給函數的namespace的值,但這根本沒有幫助。

我究竟做錯了什么? 它一定很簡單,但是我無法終生解決。

編輯

我嘗試將setParameter()value參數作為字符串和數字傳遞; 兩者都有相同的結果。

我不知道該API,但http://php.net/manual/zh/xsltprocessor.setparameter.php建議PHP傳遞的參數是一個字符串,所以也許當您執行$processor->setParameter(NULL, 'table-number', 1); 數字1作為字符串傳遞給XSLT,在這種情況下,除非您明確將它們寫為[position() = $table-number]否則XSLT中的位置謂詞將不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM