[英]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.