java xslt 转换本地名称

Posted

技术标签:

【中文标题】java xslt 转换本地名称【英文标题】:java xslt transformation local-name 【发布时间】:2020-03-24 02:20:11 【问题描述】:

我有一个 xslt 样式表,它应该进行一些通用转换。相关部分是

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="myForm/*">
    <xsl:element name="formularfeld">
        <xsl:attribute name="name">
            <xsl:value-of select="fn:local-name()" />
        </xsl:attribute>
        <xsl:value-of select="." />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

当我在 XMLSpy 中运行时,样式表按预期工作。但是,当我从 Java 8 SE 或 ServiceMix 7 调用时,我得到 错误:'Klasse "xpath-functions" kann nicht gefunden werden。 Externe Methode "xpath-functions.localName" kann nicht gefunden werden (muss "public" sein)。 致命错误:'Externe Methode "xpath-functions.localName" kann nicht gefunden werden (muss "public" sein)。 (找不到类xpath-functions。找不到外部方法xpath-functions.localName)

        StreamResult streamResult = new StreamResult(xmlOutWriter);
        Reader inputReader = new StringReader(input);
        Reader xsltReader = new StringReader(stylesheet);
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(xsltReader);
        Transformer transformer = factory.newTransformer(xslt);

        transformer.setOutputProperty(OutputKeys.ENCODING, StandardCharsets.UTF_8.name());
        transformer.setParameter("timestamp", timestamp);
        Source inputSource = new StreamSource(inputReader);
        transformer.transform(inputSource, streamResult);

【问题讨论】:

如果您想在 Java 世界中使用 XSLT,那么 Saxon 9 始终是一个选择。内置 Xalan 仅支持 XSLT 1.0。 【参考方案1】:

显然您使用的是 XSLT 1.0 处理器。在 XSLT 1.0 中,函数没有命名空间。即使在 XSLT 2.0 中,名称空间也是可选的。你可以简单地改变:

<xsl:value-of select="fn:local-name()" />

<xsl:value-of select="local-name()" />

并删除xmlns:fn="http://www.w3.org/2005/xpath-functions" 声明。

【讨论】:

以上是关于java xslt 转换本地名称的主要内容,如果未能解决你的问题,请参考以下文章

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

使用 xslt 获取位于另一个路径中的另一个 xml 值

XSLT:获取元素的前缀?

xslt 不会选择在 XSLT 转换中动态更改名称空间以进行进一步转换