第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何支持在 ExtensionFunction Saxon HE 9.7 中返回 ArrayList

如何支持在 ExtensionFunction Saxon HE 9.7 中返回 ArrayList

慕田峪7331174 2023-06-04 10:28:12
我有一個使用 Saxon HE 9.7 進(jìn)行 XML 轉(zhuǎn)換的程序。public String transform() throws TransformerException {    TransformerFactory factory = TransformerFactory.newInstance();    TransformerFactoryImpl tFactoryImpl = (TransformerFactoryImpl) factory;    Configuration saxonConfig = tFactoryImpl.getConfiguration();    Processor processor = (Processor) saxonConfig.getProcessor();    processor.registerExtensionFunction(new Employee());    Source xslt = new StreamSource(new File("mappings.xslt"));    Transformer transformer = factory.newTransformer(xslt);    Source text = new StreamSource(new File("payload.xml"));    transformer.transform(text, new StreamResult(sw));    return sw.toString();}擴(kuò)展功能類:public class Employee implements ExtensionFunction {private List<HashMap<String, String>> employee = new ArrayList<HashMap<String, String>>();private String employeeName = "John";public List<HashMap<String, String>> getEmployee() {    HashMap<String, String> map1 = new HashMap<>();    map1.put("name", "john");    HashMap<String, String> map2 = new HashMap<>();    map2.put("age", "30");    employee.add(map1);    employee.add(map2);    return employee;}public String getEmployeeName(){    return employeeName;}@Overridepublic XdmValue call(XdmValue[] arg0) throws SaxonApiException {    return new XdmAtomicValue(getEmployeeName());}@Overridepublic SequenceType[] getArgumentTypes() {    return new SequenceType[] {};}@Overridepublic QName getName() {    return new QName("test.extension.Employee", "getEmployeeName");}@Overridepublic SequenceType getResultType() {    return SequenceType.makeSequenceType(ItemType.STRING, OccurrenceIndicator.ONE);}目前,我能夠調(diào)用從 xslt 返回字符串的 getEmployeeName 方法。但是我如何修改 Employee 類以也支持返回 HasMap 的 ArrayList 即方法 getEmployee() 因?yàn)樾碌?XdmAtomicValue() 方法不將 ArrayList 作為構(gòu)造函數(shù)參數(shù)。
查看完整描述

1 回答

?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個贊

我將回答 Saxon 9.9,因?yàn)檫@是您真正應(yīng)該使用的版本。Saxon 9.7 中不存在該類XdmMap,因此使用該版本在 Java 和 XSLT 之間傳遞映射將變得困難或不可能。


您首先需要確定要返回的 XDM 類型:我假設(shè)這可能是map(xs:string, xs:string)*- 這是一系列以字符串為鍵、以字符串為值的映射。


您首先需要在您的getResultType()方法中將其聲明為結(jié)果類型。這樣做可能就足夠了:


public SequenceType getResultType() {

? ? return SequenceType.makeSequenceType(ItemType.ANY_MAP, OccurrenceIndicator.ZERO_OR_MORE);

}

這并不像它可能的那樣精確,但提供更精確的結(jié)果類型除了導(dǎo)致 Saxon 對函數(shù)實(shí)際返回的內(nèi)容進(jìn)行更仔細(xì)(和昂貴)的檢查之外不會實(shí)現(xiàn)任何其他目的。如果您想提供更精確的返回類型,則必須使用ItemTypeFactory.newMapType(...).


然后你的call()方法需要返回這個類型的一個實(shí)例。


您需要將每個 Employee 表示為XdmMap. 有兩種方法可以構(gòu)造XdmMap.


(a) 您可以構(gòu)建一個 Java HashMap<String, String>,然后使用靜態(tài)方法轉(zhuǎn)換它XdmMap.makeMap()


(b) 您可以逐步構(gòu)建地圖:


XdmMap map = new XdmMap();

map = map.put(new XdmAtomicValue("name"), new XdmAtomicValue("John Doe"));

map = map.put(new XdmAtomicValue("age"), new XdmAtomicValue("24"));

等。請注意,它XdmMap是不可變的,因此每個put()操作都會創(chuàng)建一個新XdmMap實(shí)例;原來是不變的。


最后,您需要構(gòu)建這些實(shí)例的序列XdmMap。最簡單的方法是構(gòu)造一個List<XdmMap>包含所有地圖的 Java,然后將其轉(zhuǎn)換為一個XdmValueusing new XdmValue(Iterable<...> items).


查看完整回答
反對 回復(fù) 2023-06-04
  • 1 回答
  • 0 關(guān)注
  • 164 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號