使用XSLT获取图像元数据

时间:2017-03-17 15:23:03

标签: java xml xslt saxon

我有XML,其中包含各种图像文件的链接,如下所示:

angular.module('ngWebApp').service("ngDashboardService", 
    function($http) {
       this.AddReportAudit = function (dataList) {
          var response = $http({
             method: "POST",
             url: "/Home/AddReportAudit",
             data:JSON.stringify(dataList)
          });
       return response;
    };
});

是否可以使用XSLT处理这些以获取这些图像的各种元数据,例如分辨率,宽度,高度和文件格式?所以基本上我可以将路径传递给它,它将返回我想要的数据。

我一直在寻找答案,似乎我正在寻找某种类型的java扩展函数,但我对java一无所知,因此无法真正掌握我需要做什么或如何使它工作。

有一些java函数,例如格式化日期,我已经看到了正在使用的示例,看起来并没有更难以使用标准的XSLT函数,但是我想这些本质上是处理文本而不是外部图像文件所以是我要来的地方吗?

我认为我发现的最接近我需要做的是:Running custom Java functions within XSLT and SAXON (9.1.8)

然而,我似乎无法让它对我有用。我正在尝试将<xml> <image> <name>fig1.jpg</name> <type>graphic</type> <path>C:\some folder\artwork\fig1.jpg</path> </image> <image> <name>fig2.jpg</name> <type>graphic</type> <path>C:\some folder\artwork\fig2.jpg</path> </image> </xml> 元素添加到原始XML中,因此这对我来说似乎合乎逻辑:

<size>

氧气给我这些错误信息:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ImageInfo="java:ImageInfo"
    version="2.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="path">

        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>

        <size>
            <xsl:variable name="image" select="ImageInfo:new(.)"/>
            [image] file found: 
            <xsl:value-of select="ImageInfo:getWidth($image)"/> x 
            <xsl:value-of select="ImageInfo:getHeight($image)"/>
        </size>

    </xsl:template>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我在氧气17.1中使用Saxon EE,如果有帮助的话。

任何帮助或任何指向适合XSLT适合的人的资源的指针,但总是java新手,将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为您的第一个问题可能是您没有找到文档。您只是通过从另一个StackOverflow发布中复制您不理解的代码来尝试这样做,并且复制您不理解的代码并修改它以执行稍微不同的操作从来都不是一个非常有效的策略。

我想你想要使用的ImageInfo类可能是

org.apache.commons.imaging.ImageInfo

但我不熟悉那个课程,如果不进行一些研究就无法告诉你如何使用它。我做了足够的研究,以确定它在此处记录:

https://commons.apache.org/proper/commons-imaging/

这给出了一些例子,例如如何提取图像的元数据。我担心这些示例都是Java代码,但您不太可能找到任何其他内容。它们会向您显示所需的呼叫顺序。

关于如何调用Java方法的Saxon文档在这里:     http://www.saxonica.com/documentation/index.html#!extensibility/functions

您需要确保:

(a)您已下载并安装了正在调用的任何Java库

(b)当您调用Saxon

时,此库的JAR文件位于类路径中

(c)在调用函数时使用完整的类名作为命名空间,例如

xmlns:ImageInfo="java:org.apache.commons.imaging.ImageInfo"

对不起,如果你没有Java经验,这将会有点令人生畏。