Я имел большой успех с wsdl2php. Это автоматически создаст классы обертки для всех объектов и методов, используемых в Вашем веб-сервисе.
И, конечно же, как только вы публикуете вопрос, вы сами находите ответ!
Оказывается, в ссылке на пространство имен должна быть опечатка. После двойной проверки этого сообщения:
xslt-transform-xml-with-namespaces
Что в основном оказывается тем же вопросом. (Я искал перед публикацией ... честно!), Я снова попытался добавить ссылку на пространство имен, и на этот раз это сработало безупречно!
Я сопоставил пространство имен с префиксом 'nsm' (NameSpaceMapping) и вуаля!
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:nsm="http://foo.bar/responsecode.xsd">
<xsl:template match="/">
<html><body><h2>Responses</h2>
<xsl:for-each select="nsm:root/nsm:responses/nsm:response">
<xsl:choose>
<xsl:when test="nsm:description != ''">
<br/>'''<description>
<br/>'''<xsl:value-of select="nsm:description" />
<br/>'''</description>
</xsl:when>
</xsl:choose>
<br/>
<xsl:value-of select="@code" />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Простая проблема: ваши XML-элементы находятся в пространстве имен, о котором ваш XSLT ничего не знает.
<root xmlns="http://foo.bar/responsecode.xsd">
<responses>
<!-- ... -->
</responses>
</root>
помещает ваш
и все дочерние элементы в " http://foo.bar/responsecode.xsd"
пространство имен.
Измените свой XSL следующим образом:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="http://foo.bar/responsecode.xsd"
exclude-result-prefixes="foo"
>
<xsl:template match="/">
<html>
<body>
<h2>Responses</h2>
<xsl:for-each select="foo:root/foo:responses/foo:response">
<!-- ... -->
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Обратите внимание на то, как пространство имен объявлено и имеет префикс. Позже все узлы в этом пространстве имен будут упоминаться с использованием этого префикса. exclude-result-prefixes
используется, чтобы исключить ненужное отображение пространства имен в выводе.
Это проблема пространства имен. Вам нужно будет добавить объявление пространства имен для http://foo.bar/responsecode.xsd
и ссылаться на элементы, использующие это пространство имен. Дополнительную информацию можно найти здесь .
Итак, в основном вам понадобится что-то вроде этого:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:test="http://foo.bar/responsecode.xsd">
<xsl:template match="/">
<html>
<body>
<h2>Responses</h2>
<xsl:for-each select="test:root/test:responses/test:response">
<xsl:choose>
<xsl:when test="test:description != ''">
<br/>'''<description>
<br/>'''<xsl:value-of select="test:description" />
<br/>'''</description>
</xsl:when>
</xsl:choose>
<br/>
<xsl:value-of select="@code" />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Обратите внимание на "xmlns: test" в атрибутах xsl: stylesheet
. Я провел тест, и он работает.