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的资源转换)