使用 XSLT 从 SOAP 消息中选择节点值

Selecting node values from a SOAP message using XSLT

我正在尝试从 SOAP 消息中获取值。我需要找回用户名和密码。

SOAP 消息如下所示:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header></soap:Header>
  <soap:Body>    
     <GetData xmlns="http://webservicedata.com/">   
      <oXmlElement>
        <message>
          <header>
            <username>test@gmail.com</username>
            <password>Test password</password>
          </header>
        </message>
      </oXmlElement>
    </GetData>    
  </soap:Body>
</soap:Envelope>

这是我的 XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" exclude-result-prefixes="soap msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <NewDataSet>
      <Header>           
        <username>
          <xsl:value-of select="soap:Envelope/soap:Body/GetData/oXmlElement/message/header/username"/>
        </username>
        <password>
          <xsl:value-of select="soap:Envelope/soap:Body/GetDate/oXmlElement/message/header/password"/>
        </password>
      </Header>
    </NewDataSet>
  </xsl:template>
</xsl:stylesheet>

下面是我想要的结果,如果我删除 <GetData xmlns="http://webservicedata.com/">

<?xml version="1.0" encoding="UTF-8"?>
<NewDataSet>
   <Header>
      <Portfolio />
      <username>test@gmail.com</username>
      <password>testpassword</password>
   </Header>
</NewDataSet>

GetData 上的 xmlns="http://webservicedata.com/" 将其及其所有未加前缀的后代元素放入命名空间中,因此您必须将该命名空间映射到样式表中的前缀,并在 XPath 表达式中使用该前缀 - XPath 1.0 中的无前缀名称 总是 引用 no 命名空间中的元素。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsd="http://webservicedata.com/"
    exclude-result-prefixes="soap msxsl wsd">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <NewDataSet>
      <Header>           
        <username>
          <xsl:value-of select="soap:Envelope/soap:Body/wsd:GetData/wsd:oXmlElement/wsd:message/wsd:header/wsd:username"/>
        </username>
        <!-- similar for password -->
      </Header>
    </NewDataSet>
  </xsl:template>
</xsl:stylesheet>