XML Literal с оператором Linq - PullRequest
       30

XML Literal с оператором Linq

2 голосов
/ 07 октября 2009

Я собираюсь выполнить преобразование XSLT, преобразовав XML в таблицу HTML. Это табличные данные, поэтому я не использую div. ;)

В любом случае, мне нужно повторить одну часть XSLT для размера одной из моих коллекций. Вот фрагмент кода ...

Dim styleSheet = <?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:rh="ReportHub"
  exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes" />
  <xsl:template match="rh:Report/rh:Tablix1/rh:Details_Collection">
    <xsl:variable name="alternating-row" select="position() mod 2" />
    <table class=<%= dataFormatter.formattingTableClass %>>
      <xsl:choose>
        <xsl:when test="count(rh:Details)=0">
          <tr>
            <td>There are no items listed for this client</td>
          </tr>
        </xsl:when>
        <xsl:otherwise>
          <xsl:for-each select="rh:Details">
            <tr class=<%= dataFormatter.formattingTRClass %>>
              <xsl:variable name="mainrow-position" select="position()" />
              <xsl:for-each select="@*">
                <%= From x In dataFormatter.dataColumnSettings Select 
                  <xsl:if test="name() != 'colName'">
                    <xsl:choose>
                      <xsl:when test="$mainrow-position=1">
                        <th>
                          <xsl:value-of select="name()"/>
                        </th>
                      </xsl:when>
                      <xsl:otherwise>
                        <td>
                          <xsl:value-of select="."/>
                        </td>
                      </xsl:otherwise>
                    </xsl:choose>
                  </xsl:if> 
                %>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </xsl:otherwise>
      </xsl:choose>
    </table>
  </xsl:template>
</xsl:stylesheet>

Проблема в том, что, поскольку XML внутри запроса LINQ ссылается на пространство имен xsl, я получаю:

Error   9   XML namespace prefix 'xsl' is not defined.

У кого-нибудь есть какие-нибудь умные идеи?

  • Внутренняя работа XML внутри запроса LINQ не закончена, поэтому не беспокойтесь о том, как это выглядит.

Ответы [ 3 ]

5 голосов
/ 07 октября 2009

Я был немного удивлен, что это возможно, но потом я заметил, что это работает только в VB.NET, а не в C #. :-) В любом случае, я взглянул на MSDN , чтобы узнать больше об этом, и это немного дикое предположение, но я думаю, что вам нужно использовать отдельный оператор Imports для добавления этих пространств имен. Что-то вроде:

Imports <xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Imports <xmlns:msxsl="urn:schemas-microsoft-com:xslt">
Imports <xmlns:rh="ReportHub">

Хотя это немного обоснованное предположение. Вы просили умную идею, это мое.

3 голосов
/ 07 октября 2009

Я думаю, вы должны использовать Imports statment. Примерно так:

Imports <xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
1 голос
/ 07 октября 2009

Это стандартное поведение для любой технологии запросов XML, включая XLINQ. Любые пространства имен, которые вы объявляете внутри документа, не влияют на пространства имен, используемые API запросов. Вы всегда должны сообщать запрашивающему API отдельно о пространствах имен, которые вы хотите, чтобы он распознал. Для встроенного XML VB.NET используется оператор Imports. В C # вместо этого создается экземпляр объекта XNamespace, поскольку специальный синтаксис VB.NET является просто синтаксическим сахаром над различными конструкторами XObject.

IIRC. Причина этого заключается в том, что документ, возможно, не был создан вами, поэтому вы не можете заранее предсказать, какие префиксы пространства имен могут использовать автор документа. Единственное, что можно сделать, это сообщить вашему API запросов, какие префиксы пространства имен использовать для запросов.

...