使用 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>
我正在尝试从 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>