代码之家  ›  专栏  ›  技术社区  ›  Lesleyvdp

正确的方法是遍历嵌套的XML标记、映射它们并使用XSLT进行转换

  •  0
  • Lesleyvdp  · 技术社区  · 8 年前

    我对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"
        ]
    }
    

    我使用与XSLT在同一文件夹中的XML文件,因此我事先选择这些文件,并使用名称空间机制引用它们。我最初能够通过使用 xsl:sequence 对我来说就像:

    <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>
    

    这是完美的,我设法填补了一个地图的关键与数组的来源,从图像。然而,这是我意识到我必须解码的base64编码源,我已经测试并计划使用 saxon:base64Binary-to-string(xs:base64Binary('source attribute of image goes here'), 'UTF8'))

    这就是我被困的地方。我最初试图将base64解码放入序列中,但我的编辑警告我不能在 xsl:序列 . 然后我试着在数组中循环 xsl:序列 xsl:for-each 尝试选择我的映射键,然后对数组结果逐个使用base64解码。但是,我无法确定我必须使用什么作为键选择器,因为映射使用的键与其他键一样,最初在XML文档中找不到。

    如果我的方法是不正确的开始,请随时让我知道,并指出我在正确的方向!

    1 回复  |  直到 8 年前
        1
  •  0
  •   halfer    8 年前

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

    再次感谢马丁·霍宁。结果发现我错误地使用了Saxon扩展函数。使用 array{$content/content/body/image/saxon:base64Binary-to-string(xs:base64Binary(@src), 'UTF8')} 做了实际工作,解决了我的问题。