当前位置: 首页 > 知识库问答 >
问题:

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

孔星宇
2023-03-14

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

我谷歌了很多,发现在XSLT中检索哈希图值

链接完全符合我的需要,但我得到例外,如

在{map: get($mapData,'1')}中的静态错误,在transformer.xslt: XPST0017的第23行第94列的xsl:变量/@select中的表达式中:找不到名为{http://ns.saxonica.com/map}get()的2参数函数。

我不知道我哪里做错了。

这些是我的文件。性emo.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')

共有2个答案

岳研
2023-03-14

我认为名称空间URI{http://ns.saxonica.com/map}早在它们成为W3C规范的一部分之前,就在一些早期的撒克逊实验中用于实现MAP:请参阅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()函数在样式表中解析它可能会更容易。

堵浩波
2023-03-14

关于在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 s9apihttp://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-传入从Java映射构造的XdmMaphttp://saxonica.com/html/documentation9.8/javadoc/net/sf/saxon/s9api/XdmMap.html#makeMap-java。util。地图-。

短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();        
}
 类似资料:
  • 当人们说Hashmap比列表更快时,我对Hashmap或Hashtable的概念更困惑。我很清楚散列的概念,其中的值存储在给定密钥的散列代码中。 但是,当我想检索数据时,例如,它是如何工作的,我在一个HashMap中存储n个带有n个不同键的字符串。如果我想检索与特定键关联的特定值,它将如何在O(1)的时间内返回它?因为散列密钥将与所有其他密钥进行比较,对吗?

  • 当我运行我的xsl样式表时,我需要知道是否存在一些文件。因为xslt没有本地方法来测试文件是否存在(ASFAIK),所以我想用javascript来做这件事。通常我使用saxon 9 HE,但是一些同事告诉我HE版本不支持javascript函数。有没有一种方法可以用saxon 9 HE执行java脚本函数? 我尝试过这个例子:如何在xslt中包含javaScript文件,但oxygen给了我一个

  • 我试图使用saxon-sql-10.2.jar与saxon-pe-10.2.jar.阅读了Saxon留档(说明,示例),我发现我应该使用我使用氧气模板创建的配置文件: 在cmd中,我有: 但当这运行时,我得到的信息是: 当我使用PE时,为什么会收到此消息?我已经使用Saxon查询验证了我的许可证文件是否被正确读取,并尝试了配置文件,无论是否指定许可证文件位置。我所有与Saxon相关的文件都在c:\

  • 我需要使用xquery解码转义的XML,也就是说,我有一个类似

  • 问题内容: 我有一个dynamodb表来存储电子邮件属性信息。我在电子邮件上有一个哈希键,在时间戳(数字)上有范围键。使用电子邮件作为哈希键的最初想法是按电子邮件查询所有电子邮件。但是我想做的一件事是检索所有电子邮件ID(在哈希键中)。我为此使用了boto,但不确定如何检索不同的电子邮件ID。 我当前提取10,000条电子邮件记录的代码是 但是要检索不同的记录,我将必须进行全表扫描,然后在代码中选

  • 问题内容: 我想在Python中实现HashMap。我想请用户输入。根据他的输入,我正在从HashMap中检索一些信息。如果用户输入HashMap的键,我想检索相应的值。 如何在Python中实现此功能? 问题答案: Python字典是一种内置的类型,支持键值对。 以及使用dict关键字: 要么: