我正在尝试修复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:copy
- 这没有任何区别。
答案 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信封命名空间的前缀。
这很糟糕,但似乎是让它发挥作用的唯一方法。