Получение значений hashmap в XSLT 2.0 с использованием Saxon-HE - PullRequest
0 голосов
/ 24 октября 2018

Я хочу передать объект карты в качестве параметра в версии XSLT 2.0 и хочу получить данные объекта карты в файле XSLT 2.0 с помощью Saxon-HE.

Я много гуглил и нашел Получение хэш-картызначения в ссылке XSLT

, которые полностью соответствуют моим потребностям, но я получаю исключение, например

Статическая ошибка в {map: get ($ mapData, '1'))} в выражении в xsl: variable / @ select в строке 23 столбца 94 файла transformer.xslt: XPST0017: Не удается найти функцию с двумя аргументами с именем {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));
  }


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')

transformer.xsl

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я думаю, что URI пространства имен {http://ns.saxonica.com/map} использовался во время некоторых ранних саксонских экспериментов по реализации карт задолго до того, как они стали частью спецификации W3C: см. https://www.saxonica.com/html/documentation9.4/extensions/map.html

Эта спецификация быладавно заменены функциями карты W3C, которые находятся в пространстве имен http://www.w3.org/2005/xpath-functions/map.

Это часть вашей проблемы.Другая часть - как конвертировать карту Java в карту XDM.Вы можете сделать это в Saxon 9.8 / 9.9, используя статический метод XdmMap.makeMap(java.util.Map).В некоторых случаях может быть проще передать строку, содержащую представление карты в формате JSON, а затем проанализировать ее в таблице стилей с помощью функции parse-json ().

0 голосов
/ 24 октября 2018

Что касается чтения карт XDM в XSLT, см. 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, а затем вы можете использовать h http://saxonica.com/html/documentation9.8/javadoc/net/sf/saxon/s9api/Xslt30Transformer.html#setStylesheetParameters-java.util.Map- для передачи XdmMap, созданного из вашей карты Java с 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();        
}
...