我想在XSLT 2.0版本中将Map对象作为参数传递,我想使用Saxon-HE在XSLT 2.0文件下检索Map对象数据。
我在Google上搜索了很多,发现Retrieving hashmap values in XSLT
根据我的需要完全匹配的链接,但是我遇到了
这样的异常表达式中的{map:get($ mapData,'1')}中的静态错误 xsl:variable / @ select在变压器的第23行第94列xslt: XPST0017:找不到名为{http://ns.saxonica.com/map} get()的2参数函数。
我不知道我在哪里犯错。
这些是我的文件。 SexsonDemo.java
public static void transform(String xmlFile, String xslFile) throws TransformerException,
TransformerConfigurationException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(new File(xslFile)));
Map<String,String> mapData = new HashMap<String,String>();
mapData.put("1", "188 E 6th Street");
transformer.setParameter("mapData", mapData);
transformer.transform(new StreamSource(new File(xmlFile)), new StreamResult(System.out));
}
transformer.xsl
xmlns:map="http://ns.saxonica.com/map" exclude-result-prefixes="map" >
<xsl:variable name="mapData"/>
<xsl:variable name="addressData" select="map:get($mapData,'1')"/>
在下面的行我得到异常
map:get($mapData,'1')
答案 0 :(得分:2)
我认为名称空间URI {http://ns.saxonica.com/map}是在早期的Saxon实验中用于实现地图的,远未成为W3C规范的一部分:请参见https://www.saxonica.com/html/documentation9.4/extensions/map.html
该规范很早以前已被命名空间http://www.w3.org/2005/xpath-functions/map中的W3C映射函数所取代。
那是你的问题的一部分。另一部分是如何将Java映射转换为XDM映射。您可以使用静态方法XdmMap.makeMap(java.util.Map)
在Saxon 9.8 / 9.9中执行此操作。在某些情况下,传递包含地图的JSON表示形式的字符串,然后使用parse-json()函数在样式表中对其进行解析,可能会更容易。
答案 1 :(得分:1)
有关在XSLT中读取XDM映射的信息,请参见https://xsltfiddle.liberty-development.net/6qVRKwZ,其中包含三个示例
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:param name="mapData" as="map(xs:string, xs:string)" select="map { '1' : '188 E 6th Street' }"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/">
<html>
<head>
<title>.NET XSLT Fiddle Example</title>
</head>
<body>
<h1>XPath 3.1 map example</h1>
<section>
<h2>function call syntax</h2>
<p><code>$mapData('1')</code>: <code>{$mapData('1')}</code></p>
</section>
<section>
<h2>map:get</h2>
<p><code>map:get($mapData, '1')</code>: <code>{map:get($mapData, '1')}</code></p>
</section>
<section>
<h2><code>?</code> operator</h2>
<p><code>$mapData?('1')</code>: <code>{$mapData?('1')}</code></p>
</section>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
要通过Java代码设置此参数,请考虑使用Saxon s9api http://saxonica.com/html/documentation9.8/using-xsl/embedding/s9api-transformation.html运行Saxon,然后可以使用hhttp://saxonica.com/html/documentation9.8/javadoc/net/sf/ saxon / s9api / Xslt30Transformer.html#setStylesheetParameters-java.util.Map-可以传入使用http://saxonica.com/html/documentation9.8/javadoc/net/sf/saxon/s9api/XdmMap.html#makeMap-java.util.Map-从Java Map构建的XdmMap。
简短的Java示例是
public static void MapExample() throws SaxonApiException {
Processor processor = new Processor(false);
XsltExecutable executable = processor.newXsltCompiler().compile(new StreamSource("sheet.xsl"));
Xslt30Transformer transformer = executable.load30();
Map<String,String> mapData = new HashMap<String,String>();
mapData.put("1", "188 E 6th Street");
HashMap<QName, XdmValue> parameters = new HashMap<>();
parameters.put(new QName("mapData"), XdmMap.makeMap(mapData));
transformer.setStylesheetParameters(parameters);
transformer.applyTemplates(new StreamSource("input1.xml"), transformer.newSerializer(System.out));
System.out.println();
}