【发布时间】:2015-04-05 22:56:35
【问题描述】:
我在 Datapower 中的 XSLT 转换中需要以下行为:
输入文字:
AAAAAZZZZZZZ
BBBBBZZZZZZZ
CCCCCZZZZZZZ
输出文本:
_HEADER
AAAAA
BBBBB
CCCCC
_FOOTER
所以我编写了以下 XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:str="http://exslt.org/strings"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="dp str date"
>
<dp:input-mapping href="store:///pkcs7-convert-input.ffd" type="ffd"/>
<xsl:output method="text"/>
<xsl:variable name="rowsep" select="' '"/>
<xsl:variable name="input64" select="dp:binary-encode(/object/message/node())"/>
<xsl:variable name="str" select="dp:decode($input64,'base-64')"/>
<xsl:template match="/">
<!-- Header -->
<xsl:text>_HEADER </xsl:text>
<!-- Body -->
<xsl:for-each select="str:split($str,$rowsep)">
<xsl:if test="position()!=last()">
<xsl:value-of select="substring(.,1,5)"/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
<!-- Trailer -->
<xsl:text>_FOOTER </xsl:text>
</xsl:template>
</xsl:stylesheet>
但它正在生成以下输出:
_HEADER
_HEAD
AAAAA
BBBBB
CCCCC
_FOOTER
我不明白为什么 for-each 标记之外的每个文本或 value-of 标记都会生成奇怪的输出(或者至少我无法找到错误的模式)。如您所见,标头“部分”重复,不知道这种行为的原因。
能否请您给我一些提示,说明错误在哪里?
【问题讨论】:
-
您在此处展示的 XSLT 样式表暴露了这种行为?如果是这样,您能否包含
$str的值? -
$str 是 /object/message/node(),表示整个输入内容:
-
我能够在 DataPower vm 上运行您的代码并获得预期的结果。您最好的选择可能是通过添加一个输出 $input64 内容的
xsl:value-of行进行调试,然后转到一些在线 Base64 转换器并查看您是否真的正确获取了输入数据(包括行尾)。跨度> -
谢谢@bjimba,似乎很好,包括行尾。我看到的是行为中的一种缓冲,如您所见,_HEADER 存储为 for each 的第一个元素......您在 DP 中究竟如何测试这种场景?我正在使用多协议网关,请求和响应类型为非 XML。
-
我使用的是带有非 XML 请求和环回的 XMLFW。处理策略有一个规则(客户端到服务器),该规则的唯一操作是使用您的确切 XSL 代码的“转换二进制文件”和结果操作。我使用 curl 发送输入:
curl --data-binary @nonxml-in.txt http://mydphost:8009/你打开探针了吗?你的输入上下文是什么样的?
标签: xml xslt ibm-datapower