0

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

输出不验证,因为 SOAP 1.2 模式将<Value>元素描述为包含一个限定的枚举值;例如:

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

<Value>MustUnderstand</Value>才不是;

与哪里prefix有关xmlns: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:copyvalue-of 的位置,这没什么区别。

4

2 回答 2

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>
于 2013-07-05T13:04:36.177 回答
0

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

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

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

于 2013-07-06T12:56:42.760 回答