【问题标题】:Transform soap 1.1 fault into soap 1.2 fault将soap 1.1故障转化为soap 1.2故障
【发布时间】:2013-07-05 12:06:18
【问题描述】:

我正在尝试修复给我的 BizTalk 映射中的一些不足之处,该映射旨在使用关联的 XSLT 样式表将 SOAP 1.1 故障映射到 SOAP 1.2 故障。

输出未验证,因为 SOAP 1.2 架构将 <Value> 元素描述为包含限定的枚举值;例如:

<Value>prefix:MustUnderstand</Value> 验证;

<Value>MustUnderstand</Value> 没有;

其中prefixxmlns:prefix="http://www.w3.org/2003/05/soap-envelope'" 相关。

从输入文档生成此元素的标记是(仅相关部分):

<xsl:element name="Value">
    <xsl:value-of select="s11:Fault/faultcode/text()"/>
</xsl:element>

如何让 XSLT 识别枚举值必须是合格的并提供适当的名称空间前缀?我已经尝试用xsl:copy 代替 value-of,这没什么区别。

【问题讨论】:

    标签: xml xslt soap biztalk


    【解决方案1】:

    我不知道您将如何确定何时需要和不需要前缀,但您可以确定要与

    一起使用的前缀
    name(namespace::*[. = 'http://www.w3.org/2003/05/soap-envelope'])
    

    或者更具体的例子:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:variable name="soapNs" select="'http://www.w3.org/2003/05/soap-envelope'" />
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="Value">
        <xsl:copy>
          <xsl:value-of select="concat(name(namespace::*[. = $soapNs]), ':', 
                                       s11:Fault/faultcode)"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 谢谢,这是一个方便的健壮性调整,我可以用它来提高我的解决方案的可读性。在阅读此答案之前,我不知道 namespace 轴。
    【解决方案2】:

    事实证明,我的问题的直接答案似乎是“你不能”-this question 表明不支持模式的 XML 处理器只会在元素简单内容中看到文本,并且无法区分一个字符串从另一个字符串。由于 XSLT 1.0 不是(非常)模式感知的,因此期望它能够识别元素内部的 QName 似乎是不可能的。

    我发现的解决方法是调用一个模板,该模板会去掉“:”字符之前的任何内容,并在其位置连接 soap 1.2 信封命名空间的前缀。

    这很糟糕,但似乎是让它工作的唯一方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2014-05-29
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多