Как отобразиться, XSD проверил XML, использующий XSLT

Я имел большой успех с wsdl2php. Это автоматически создаст классы обертки для всех объектов и методов, используемых в Вашем веб-сервисе.

7
задан Robert Sirre 18 November 2009 в 15:16
поделиться

3 ответа

И, конечно же, как только вы публикуете вопрос, вы сами находите ответ!

Оказывается, в ссылке на пространство имен должна быть опечатка. После двойной проверки этого сообщения:

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/>'''&lt;description&gt;
                                                <br/>'''<xsl:value-of select="nsm:description" />
                                                <br/>'''&lt;/description&gt;
                                        </xsl:when>
                                </xsl:choose>
                                <br/>
                                <xsl:value-of select="@code" />

                        </xsl:for-each>
                </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
7
ответ дан 6 December 2019 в 09:20
поделиться

Простая проблема: ваши 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 используется, чтобы исключить ненужное отображение пространства имен в выводе.

9
ответ дан 6 December 2019 в 09:20
поделиться

Это проблема пространства имен. Вам нужно будет добавить объявление пространства имен для 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/>'''&lt;description&gt;
              <br/>'''<xsl:value-of select="test:description" />
              <br/>'''&lt;/description&gt;
            </xsl:when>
          </xsl:choose>
          <br/>
          <xsl:value-of select="@code" />

        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание на "xmlns: test" в атрибутах xsl: stylesheet . Я провел тест, и он работает.

4
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: