使用XSL从WCF Soap消息中提取值

时间:2010-12-29 20:18:59

标签: wcf xslt soap xml-namespaces

我正在尝试使用XSL转换以下WCF调用并将结果放入队列中:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">SendMessage</a:Action>
    <a:MessageID>urn:uuid:19034ce7-c5ce-4670-ac6c-cfef30c245bd</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
  </s:Header>
  <s:Body>
    <SendMessage xmlns="http://my.custom.namespace/2007/12">
      <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <to>Test</to>
        <from>Test</from>
        <message>Test</message>
        <service>Test</service>
      </request>
    </SendMessage>
  </s:Body>
</s:Envelope>

我想要做的是转到'to','from','message'和'service'节点,但由于子节点中使用的默认命名空间,我无法选择。有没有人知道我应该用来访问这些节点的正确xPath查询?

谢谢,

迈克

1 个答案:

答案 0 :(得分:1)

  

我想做的就是去   'to','from','message'和'service'   节点,但我遇到了麻烦   由于默认选择超出范围   子节点中使用的名称空间。   有谁知道正确的xPath   我应该用来查询   这些节点?

使用

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:s="http://www.w3.org/2003/05/soap-envelope"
 xmlns:sb="http://my.custom.namespace/2007/12">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/s:Body/sb:SendMessage/sb:request/*"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
        <a:Action s:mustUnderstand="1">SendMessage</a:Action>
        <a:MessageID>urn:uuid:19034ce7-c5ce-4670-ac6c-cfef30c245bd</a:MessageID>
        <a:ReplyTo>
            <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
        </a:ReplyTo>
    </s:Header>
    <s:Body>
        <SendMessage xmlns="http://my.custom.namespace/2007/12">
            <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <to>Test</to>
                <from>Test</from>
                <message>Test</message>
                <service>Test</service>
            </request>
        </SendMessage>
    </s:Body>
</s:Envelope>

输出所需节点

<to xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</to>
<from xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</from>
<message xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</message>
<service xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</service>