在XSL脚本的帮助下,我将URL从XML提取到文件。此URL的结局是:api/v1/objects/uuid/b79de4e5-8d1f-4840-b85f-e052db92a52f/file/id/1001974122/file_version/name/small/disposition/inline
当我在Web浏览器中输入此URL时,它将通过文件扩展名在结束eas/partitions-inline/48/1001/1001974000/1001974122/9a4191c7ce7414650d36ac9bc1c2b012261013ad/image/png/8223@33a8cae1-a9fa-4655-8c3d-b71241bbc99b_1001974122_small.png
有没有XSL没有浏览器的XSL进行此转换的方法?
我需要输出XML中有文件扩展名的URL,以便将收割机运行。
这个问题是关于URL转换(以及使用的XML工具(非常非正式的,但是让我们假设对原始URL的3xx响应以及输出结果URL的意图。例如:
$ curl --silent --head http://stackoverflow.com | grep Location
Location: https://stackoverflow.com/
在转换XML时要做同样的事情。XSLT处理器需要拥有HTTP客户端。Expath中有HTTP客户端模块,收集了XPATH扩展规范和实现。
要快速安装expath,下载页面上有安装程序。它带有撒克逊XSLT处理器。在编写时,它是指expath-repo-installer-0.13.1.jar
。像:
java -jar expath-repo-installer-0.13.1.jar
安装后,下载了用于撒克逊人,expath-http-client-saxon-0.12.0.zip
的HTTP客户端模块,然后从中提取expath-http-client-saxon-0.12.0.xar
。然后将其安装到expath存储库:
mkdir repo
bin/xrepo --repo repo install /path/to/expath-http-client-saxon-0.12.0.xar
然后您可以使用bin/saxon
。
data.xml
<?xml version="1.0" encoding="utf-8"?>
<data>
<datum><url>http://python.org</url></datum>
<datum><url>http://stackoverflow.com</url></datum>
</data>
text.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:http="http://expath.org/ns/http-client"
exclude-result-prefixes="#all"
version="2.0">
<xsl:import href="http://expath.org/ns/http-client.xsl"/>
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<result>
<xsl:for-each select="data/datum">
<!-- the request element -->
<xsl:variable name="request" as="element(http:request)">
<http:request method="head" follow-redirect="false">
<xsl:attribute name="href">
<xsl:value-of select="url"/>
</xsl:attribute>
</http:request>
</xsl:variable>
<!-- sending the request -->
<xsl:variable name="response" select="http:send-request($request)"/>
<!-- output -->
<url>
<orig><xsl:value-of select="url"/></orig>
<location>
<xsl:value-of
select="$response[1]/header[@name='location']/@value"/>
</location>
</url>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
有关如何控制HTTP客户端的更多详细信息,请参见该模块的规格。
然后bin/saxon --repo repo data.xml test.xslt
产生:
<?xml version="1.0" encoding="utf-8"?>
<result>
<url>
<orig>http://python.org</orig>
<location>https://python.org/</location>
</url>
<url>
<orig>http://stackoverflow.com</orig>
<location>https://stackoverflow.com/</location>
</url>
</result>