正确的方法来遍历嵌套的XML标签,映射它们并使用XSLT进行转换

时间:2018-08-14 12:11:28

标签: xml xslt

我对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文档中找到的。

如果我的方法不正确,请先让我知道并指出正确的方向!

1 个答案:

答案 0 :(得分:0)

(代表问题作者发布了答案)

再次感谢Martin Honnen。原来我没有正确使用Saxon扩展功能。实际上,使用array{$content/content/body/image/saxon:base64Binary-to-string(xs:base64Binary(@src), 'UTF8')}可以解决我的问题。