2009-10-07 3 views
2

XML을 HTML 테이블로 변환하는 XSLT 변환을 수행하려고합니다. 표 형식의 데이터이므로 div 형식을 사용하지 않습니다. ;)Linq 문을 사용한 XML 리터럴

어쨋거나, 내 컬렉션 중 하나의 크기에 맞게 XSLT의 한 부분을 반복해야합니다.

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

누구나 어떤 영리한 아이디어를 가지고 : 여기

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 네임 스페이스를 참조하기 때문에, 내가 얻을입니다 ... 코드의 조각인가?

  • LINQ 쿼리 내부의 XML 내부 동작이 완료되지 않았으므로 모양이 걱정되지 않도록하십시오.

답변

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"> 

약간의 추측이 있습니다. 당신은 영리한 생각을 물었습니다. 이것은 제 것이 었습니다.

3

나는 Imports 문을 사용해야한다고 생각합니다. 이 같은 뭔가 :

Imports <xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
+0

이것은 내 대답과 다릅니다. –

+0

같은 대답입니다. 우리는 방금 동시에 그것을 작성했습니다. –

+1

나는 이것이 처음에 추가되었다고 생각했다 ... 내가 틀렸다면, 나쁘다. – GordonB

1

이 어떤 XML 쿼리와 기술 표준 동작입니다, XLINQ이 포함되어 있습니다. 문서 내부에 선언 한 네임 스페이스는 쿼리 API에서 사용하는 네임 스페이스에 영향을주지 않습니다. 항상 네임 스페이스를 인식 할 수 있도록 쿼리 API에 개별적으로 알릴 필요가 있습니다. VB.NET 인라인 XML의 경우 Imports 문을 사용합니다. C#에서는 VBOME 특수 구문이 다양한 XObject 생성자에 대한 구문 식 설탕이기 때문에 XNamespace 개체를 대신 인스턴스화합니다.

IIRC 뒤에있는 이유는 문서 작성자가 작성하지 않았을 수 있으므로 문서 작성자가 사용하기로 선택한 네임 스페이스 접두사를 미리 예측할 방법이 없다는 것입니다. 유일하게 안전한 일은 쿼리하는 API에 쿼리에 사용할 네임 스페이스 접두사를 알려주는 것입니다.

+0

그럼, 맞 겠지? :-) –