将肥皂1.1故障转化为肥皂1.2故障

时间:2013-07-05 12:06:18

标签: xml xslt soap biztalk

我正在尝试修复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 - 这没有任何区别。

2 个答案:

答案 0 :(得分:2)

我不知道如何确定它何时发生并且不需要前缀,但您可以确定要用于的前缀

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>

答案 1 :(得分:0)

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

我找到的解决方法是调用一个模板,该模板剥离“:”字符前面的任何内容,并在其位置汇总soap 1.2信封命名空间的前缀。

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