简体   繁体   English

使用Saxon-HE检索XSLT 2.0中的哈希图值

[英]Retrieving hashmap values in XSLT 2.0 Using Saxon-HE

I want to pass Map object as parameter in XSLT 2.0 version and i want to retrieve the Map object data under XSLT 2.0 file using Saxon-HE. 我想在XSLT 2.0版本中将Map对象作为参数传递,并且我想使用Saxon-HE在XSLT 2.0文件下检索Map对象数据。

I googled a lot and found Retrieving hashmap values in XSLT 我在Google上搜索了很多,发现在XSLT中检索哈希图值

link which completely matches according to my need but i am getting exception such as 完全根据我的需要匹配的链接,但我正在获取诸如

Static error in {map:get($mapData,'1')} in expression in xsl:variable/@select on line 23 column 94 of transformer.xslt: XPST0017: Cannot find a 2-argument function named { http://ns.saxonica.com/map }get(). {transform.get($ mapData,'1')}中xsl:variable / @ select的表达式中的静态错误,位于变压器的第23行第94列。xslt:XPST0017:找不到名为{ http://的2参数函数ns.saxonica.com/map } get()。

I don't know where i am doing mistake. 我不知道我在哪里做错。

These are the my files. 这些是我的文件。 SexsonDemo.java 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 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')"/>

at below line i getting exception map:get($mapData,'1') 在下面的行我得到异常map:get($mapData,'1')

transformer.xsl

I think that the namespace URI { http://ns.saxonica.com/map } was used during some early Saxon experiments in implementing maps, long before they were part of the W3C specification: see https://www.saxonica.com/html/documentation9.4/extensions/map.html 我认为名称空间URI { http://ns.saxonica.com/map }在实施地图的早期Saxon实验中就已使用,早在它们成为W3C规范的一部分之前:请参阅https://www.saxonica.com /html/documentation9.4/extensions/map.html

That specification was long ago superseded by the W3C map functions, which are in namespace http://www.w3.org/2005/xpath-functions/map . 早在W3C映射功能(位于命名空间http://www.w3.org/2005/xpath-functions/map中)就已取代了该规范。

That's part of your problem. 那是你问题的一部分。 The other part is how to convert a Java map to an XDM map. 另一部分是如何将Java映射转换为XDM映射。 You can do this in Saxon 9.8/9.9 using the static method XdmMap.makeMap(java.util.Map) . 您可以在Saxon 9.8 / 9.9中使用静态方法XdmMap.makeMap(java.util.Map) It might be easier in some cases to pass in a string containing a JSON representation of the map, and then parse it within the stylesheet using the parse-json() function. 在某些情况下,传递包含地图的JSON表示的字符串,然后使用parse-json()函数在样式表中对其进行解析,可能会更容易。

As for reading XDM maps in XSLT, see https://xsltfiddle.liberty-development.net/6qVRKwZ which has three examples 至于在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>

For setting this parameter from your Java code, consider using the Saxon s9api http://saxonica.com/html/documentation9.8/using-xsl/embedding/s9api-transformation.html to run Saxon and then you can use hhttp://saxonica.com/html/documentation9.8/javadoc/net/sf/saxon/s9api/Xslt30Transformer.html#setStylesheetParameters-java.util.Map- to pass in an XdmMap constructed from your Java Map with http://saxonica.com/html/documentation9.8/javadoc/net/sf/saxon/s9api/XdmMap.html#makeMap-java.util.Map- . 要从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从Java Map构建的XdmMap。 com / html / documentation9.8 / javadoc / net / sf / saxon / s9api / XdmMap.html#makeMap-java.util.Map-

Short Java sample is 简短的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();        
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM