Преобразование XML с помощью XSLT, проблема с пространством имен - PullRequest
0 голосов
/ 22 октября 2011

У меня проблема с преобразованием данных XML с помощью шаблона xslt.Я предполагаю, что проблема связана с пространством имен в XML, после того, как я удаляю пространство имен xmlns="http://schemas.microsoft.com/sharepoint/soap/, все работает нормально.

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetListCollectionResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/">
            <GetListCollectionResult>
                <Lists>
                    <List Title="Announcement1" Description="Announcement 1"/>
                    <List Title="Announcement2" Description="Announcement 2"/>
                </Lists>
            </GetListCollectionResult>
        </GetListCollectionResponse>
    </soap:Body>
</soap:Envelope>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl">

  <xsl:template match="//Lists">
    <table>
      <xsl:for-each select="List">
        <tr>
          <td>
            <xsl:value-of select="@Title"/>:
          </td>
          <td>
            <xsl:value-of select="@Description"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

1 Ответ

2 голосов
/ 22 октября 2011

Просто добавьте пространство имен в таблицу стилей, и оно будет работать нормально. Вот ваша таблица стилей с использованием пространства имен ms. Вы можете использовать любой префикс, который хотите:

<xsl:stylesheet version="1.0"
  xmlns:ms="http://schemas.microsoft.com/sharepoint/soap/"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="msxsl ms">

  <xsl:template match="//ms:Lists">
    <table>
      <xsl:for-each select="ms:List">
        <tr>
          <td>
            <xsl:value-of select="@Title"/>:
          </td>
          <td>
            <xsl:value-of select="@Description"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

Это дает следующий вывод:

<table><tr><td>Announcement1:
  </td><td>Announcement 1</td></tr><tr><td>Announcement2:
  </td><td>Announcement 2</td></tr></table>

В качестве альтернативы, в XSLT 2.0 вы можете просто использовать звездочку (*) для префикса и вообще не добавлять пространство имен:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="msxsl">

  <xsl:template match="//*:Lists">
    <table>
      <xsl:for-each select="*:List">
        <tr>
          <td>
            <xsl:value-of select="@Title"/>:
          </td>
          <td>
            <xsl:value-of select="@Description"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

Будет получен тот же вывод, что и в предыдущем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...