我对XSLT还是很陌生,并且为解决问题而烦恼。我有一个包含特定布局的XML文档。我的问题所在的部分围绕以下内容:
<content>
<body>
<p>Paragraphs are a possibility</p>
<image src="base64-encoded-source" />
<image src="another-base64-encoded-source" />
</body>
</content>
我要实现的目标是使用JSON
输出正确的xsl:map
,如下所示:
{
body-images: [
"decoded-source",
"another-decoded-source"
]
}
我使用的XML文件与XSLT位于同一文件夹中,因此我预先选择了这些文件,并使用名称空间机制对其进行了引用。我最初可以通过使用xsl:sequence
来实现上述JSON示例的第一步,对我来说,它看起来像:
<xsl:if test="not(empty($content/content/body/image))">
<xsl:map-entry key="string('body-images')">
<xsl:sequence select="array{$content/content/body/image/@src/string()}"/>
</xsl:map-entry>
</xsl:if>
这太完美了,我设法用图像中的一系列来源填充了一个地图关键字。但是,这是我意识到必须解码经过测试并计划使用saxon:base64Binary-to-string(xs:base64Binary('source attribute of image goes here'), 'UTF8'))
进行的base64编码源的地方。
这就是我被困住的地方。我本来尝试将base64解码放入序列中,但我的编辑器警告我,我无法在xsl:sequence
内使用这种形式的转换。然后,我尝试使用xsl:sequence
遍历xsl:for-each
为我提供的数组,并尝试选择我的映射键,然后依次对数组结果使用base64解码。我无法弄清楚我必须用作键选择器的原因,因为映射所使用的键最初不是像其他键一样在XML文档中找到的。
如果我的方法不正确,请先让我知道并指出正确的方向!
答案 0 :(得分:0)
(代表问题作者发布了答案)。
再次感谢Martin Honnen。原来我没有正确使用Saxon扩展功能。实际上,使用array{$content/content/body/image/saxon:base64Binary-to-string(xs:base64Binary(@src), 'UTF8')}
可以解决我的问题。