2

我将执行 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>

问题是因为 LINQ 查询中的 XML 引用了 xsl 命名空间,所以我得到:

错误 9 XML 命名空间前缀“xsl”未定义。

任何人有任何聪明的想法?

  • LINQ 查询中 XML 的内部工作还没有完成,所以不要担心它是什么样子的。
4

3 回答 3

5

我有点惊讶这是可能的,但后来我注意到这只适用于 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">

不过,这是一个有根据的猜测。你要求一个聪明的主意,这是我的。

于 2009-10-07T08:57:00.780 回答
3

我认为您必须使用Imports声明。像这样的东西:

Imports <xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
于 2009-10-07T08:57:40.077 回答
1

这是任何 XML 查询技术(包括 XLINQ)的标准行为。您在文档中声明的任何命名空间都不会影响查询 API 使用的命名空间。您总是必须单独通知查询 API 您希望它识别的命名空间。对于 VB.NET 内联 XML,您使用该Imports语句。在 C# 中,您将实例化一个XNamespace对象,因为 VB.NET 特殊语法只是各种XObject构造函数的语法糖。

IIRC 这背后的原因是该文档可能不是您制作的,因此您无法提前预测文档作者可能选择使用的命名空间前缀。唯一安全的做法是告诉您的查询 API 用于查询的命名空间前缀。

于 2009-10-07T09:12:55.660 回答