簡體   English   中英

XSLT 生成 output 在撒克遜語中帶有未聲明的命名空間前綴。 錯誤 XTSE1430:命名空間前綴 exsl 未聲明

[英]XSLT generates output with undeclared namespace prefix in Saxon. error XTSE1430: Namespace prefix exsl is undeclared

我正在嘗試針對 XML 實例驗證 Yang model。 我發現這個 bash 腳本 [1] 可以完成這項工作,但我想使用 Java 重寫它。

撒克遜版本

Saxon 9.9.1-5.

xsltproc 版本

Using libxml 20904, libxslt 10129 and libexslt 817

使用 Bash 中的 xsltproc,以下命令成功並生成包含 exslt 命名空間的有效 xml、sch2。

xsltproc -o output1 iso_abstract_expand.xsl example.sch
xsltproc -o sch iso_svrl_for_xslt1.xsl output1
xsltproc -o sch2 sch inst

當我在 Java 中重寫上述命令時,我得到

Static error at xsl:stylesheet on line 17 column 31 
XTSE1430: Namespace prefix exsl is undeclared

Java代碼

class Test {
    public static StringBuffer transform(Source xsltSource, Source xmlSource) throws TransformerException {
        TransformerFactory transFact = new TransformerFactoryImpl();
        StringWriter sw = new StringWriter();
        Result result = new StreamResult(sw);
        Transformer transformer = transFact.newTransformer(xsltSource);
        transformer.transform(xmlSource, result);
        return sw.getBuffer();
    }

    public static StringBuffer xsltproc(String xslt, String xml) throws TransformerException {
        return transform(
                new StreamSource(new File(xslt)),
                new StreamSource(new File(xml))
        );
    }

    public static StringBuffer xsltproc(String xslt, StringBuffer xml) throws IOException, TransformerException {
        return transform(
                new StreamSource(new File(xslt)),
                new StreamSource(IOUtils.toInputStream(xml))
        );
    }

    public static StringBuffer xsltproc(StringBuffer xslt, String xml) throws IOException, TransformerException {
        return transform(
                new StreamSource(IOUtils.toInputStream(xslt)),
                new StreamSource(new File(xml))
        );
    }

    public static void main(String args[]) {
        try {
            StringBuffer output1 = xsltproc("iso_abstract_expand.xsl", "example.sch");
            StringBuffer sch = xsltproc("iso_svrl_for_xslt1.xsl", output1);
            StringBuffer sch = xsltproc(sch, "inst");
        }
        catch (Exception e) {
            e.printStackTrace();
        }

    }
}

其中“iso_abstract_expand.xsl”、“example.sch”、“iso_svrl_for_xslt1.xsl”、“inst”是磁盤上與上述 Java class 位於同一文件夾中的文件。

iso_abstract_expand.xsl

https://github.com/mbj4668/pyang/blob/master/xslt/iso_abstract_expand.xsl

iso_svrl_for_xslt1.xsl

https://github.com/mbj4668/pyang/blob/master/xslt/iso_svrl_for_xslt1.xsl

例子.sch

<?xml version="1.0" encoding="utf-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="exslt"><sch:ns uri="http://exslt.org/dynamic" prefix="dyn"/><sch:ns uri="http://example.net/turing-machine" prefix="tm"/><sch:ns uri="urn:ietf:params:xml:ns:netconf:base:1.0" prefix="nc"/><sch:let name="root" value="/nc:config"/><sch:pattern abstract="true" id="turing-machine___tape-cells"><sch:rule context="$start/$pref:cell"><sch:report test="preceding-sibling::$pref:cell[$pref:coord=current()/$pref:coord]">Duplicate key "coord"</sch:report></sch:rule></sch:pattern><sch:pattern id="turing-machine"><sch:rule context="/nc:config/tm:turing-machine/tm:transition-function/tm:delta"><sch:report test="preceding-sibling::tm:delta[tm:label=current()/tm:label]">Duplicate key "tm:label"</sch:report><sch:report test="preceding-sibling::tm:delta[tm:input/tm:state=current()/tm:input/tm:state and tm:input/tm:symbol=current()/tm:input/tm:symbol]">Violated uniqueness for "tm:input/tm:state tm:input/tm:symbol"</sch:report></sch:rule></sch:pattern><sch:pattern id="idm14" is-a="turing-machine___tape-cells"><sch:param name="start" value="/nc:config/tm:turing-machine/tm:tape"/><sch:param name="pref" value="tm"/></sch:pattern></sch:schema>

安裝

<?xml version="1.0" encoding="utf-8"?>
<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><turing-machine xmlns="http://example.net/turing-machine"><transition-function><delta><label>left summand</label><input><state>0</state><symbol>1</symbol></input><tm:output xmlns:tm="http://example.net/turing-machine"><?dsrl?><tm:head-move>right</tm:head-move></tm:output></delta><delta><label>separator</label><input><state>0</state><symbol>0</symbol></input><output><state>1</state><symbol>1</symbol><tm:head-move xmlns:tm="http://example.net/turing-machine"><?dsrl?>right</tm:head-move></output></delta><delta><label>right summand</label><input><state>1</state><symbol>1</symbol></input><tm:output xmlns:tm="http://example.net/turing-machine"><?dsrl?><tm:head-move>right</tm:head-move></tm:output></delta><delta><label>right end</label><input><state>1</state><symbol/></input><output><state>2</state><head-move>left</head-move></output></delta><delta><label>write separator</label><input><state>2</state><symbol>1</symbol></input><output><state>3</state><symbol>0</symbol><head-move>left</head-move></output></delta><delta><label>go home</label><input><state>3</state><symbol>1</symbol></input><output><head-move>left</head-move></output></delta><delta><label>final step</label><input><state>3</state><symbol/></input><output><state>4</state><tm:head-move xmlns:tm="http://example.net/turing-machine"><?dsrl?>right</tm:head-move></output></delta></transition-function></turing-machine></config>

實際上,最后一個 Java 命令的 output 沒有 exslt 命名空間,而最后一個命令的 output 在 Bash 中包含命名空間(使用 xsltproc)

xmlns:exsl="http://exslt.org/common"

[1] https://github.com/mbj4668/pyang/blob/master/bin/yang2dsdl

錯誤 XTSE1430 意味着有一個extension-element-prefixes屬性包含尚未聲明的命名空間前綴 ( exsl )。

從給出的extension-element-prefixes屬性如何生成的信息中尚不清楚,但生成它的不是撒克遜人,它是用戶編寫的 XSLT 代碼,因此確保聲明命名空間的責任落在用戶編寫的代碼。

Saxon 將始終確保聲明元素和屬性名稱中使用的命名空間前綴(稱為“命名空間修復”的過程),但它不能對文本或屬性節點內容中使用的前綴執行此操作:這是用戶的責任.

我沒有嘗試研究您鏈接到的文件中的源代碼。

暫無
暫無

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

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