java - 使用 Saxon-HE 检索 XSLT 2.0 中的 HashMap 值

标签 java xml xslt-2.0 saxon

我想在 XSLT 2.0 版本中将 Map 对象作为参数传递,并且想使用 Saxon-HE 检索 XSLT 2.0 文件下的 Map 对象数据。

我用谷歌搜索了很多,发现 Retrieving hashmap values in XSLT

链接完全符合我的需要,但我遇到了异常,例如

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().

我不知道我哪里做错了。

这些是我的文件。 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));
  }


变压器.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')

transformer.xsl

最佳答案

关于在 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- 传入构造的 XdmMap从您的 Java map http://saxonica.com/html/documentation9.8/javadoc/net/sf/saxon/s9api/XdmMap.html#makeMap-java.util.Map-

简短的 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();        
}

关于java - 使用 Saxon-HE 检索 XSLT 2.0 中的 HashMap 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52966378/

相关文章:

java - Android Studio : java. lang.NullPointerException:尝试在空对象引用上调用虚拟方法 [TextView]

java - 短语 "Java is platform independent"和 "Java is portable"有什么区别?

java - Solr 从索引中提取数据到 XML 文件

xslt - 要比较XSLT中的两个元素(字符串类型)?

xml - 在解析之前测试文档是否格式正确

java - Failed to redefine class 当我尝试重新转换类时

java - 在 Java 中将信息传送到另一个进程的首选方式是什么?

java - 在将 XML 映射到 Java Bean 方面需要帮助

java - 在Scala play框架中处理xml

xml - 将多个元素值连接到 xslt 2.0 中的新字符串的最佳方法是什么