2012-06-11 2 views
0

xml 파일을로드하고 "XslCompiledTransform"을 사용하여 XSLT를 적용하는 코드가 있습니다. 입력 파일이 XML이 아니 어서 코드를 변경해야하며 CSV 파일 일 수도 있습니다. CSV를 원하는 형식으로 변환하는 XSLT가 있지만 하드 코드 된 경로를 사용합니다. 내가 가진 문제는 입력 파일 이름이 바뀌므로 이름에 widecard를 사용할 수 있습니까? 둘째, 코드에서 파일에서 XSLT 객체에 문자열로 전달하여 그 결과가 맨 아래로 떨어지게 할 수 있습니까? 나는 인터넷 검색을하고 있었고 어떤 코드도 발견하지 못했습니다. 심지어 가능할까요?XSLT가 외부 CSV 파일에 어떻게 적용됩니까?

다음은 현재 사용중인 XSLT입니다. 하드 코드 된 경로 및 파일 이름이 아닙니다.

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="fn" 
    exclude-result-prefixes="xs fn"> 

<xsl:output indent="yes" encoding="US-ASCII"/> 

<xsl:param name="pathToCSV" select="'file:///C:/Downloads/inputcsv.csv'"/> 

<xsl:function name="fn:getTokens" as="xs:string+"> 
    <xsl:param name="str" as="xs:string"/> 
     <xsl:analyze-string select="concat($str, ',')" regex='(("[^"]*")+|[^,]*),'> 
      <xsl:matching-substring> 
       <xsl:sequence select='replace(regex-group(1), "^""|""$|("")""", "$1")'/> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
</xsl:function> 

<xsl:template match="/" name="main"> 
    <xsl:choose> 
     <xsl:when test="unparsed-text-available($pathToCSV)"> 
      <xsl:variable name="csv" select="unparsed-text($pathToCSV)"/> 
      <xsl:variable name="lines" select="tokenize($csv, '&#xD;')" as="xs:string+"/> 
      <xsl:variable name="elemNames" select="fn:getTokens($lines[1])" as="xs:string+"/> 
      <root> 
       <xsl:for-each select="$lines[position() > 0]"> 
        <row> 
         <xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+"/> 

         <xsl:for-each select="$elemNames"> 
          <xsl:variable name="pos" select="position()"/> 
          <column> 
           <xsl:value-of select="$lineItems[$pos]"/> 
          </column> 
         </xsl:for-each> 
        </row> 
       </xsl:for-each> 
      </root> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>Cannot locate : </xsl:text><xsl:value-of select="$pathToCSV"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

답변

2

잘 XslCompiledTransform 그렇게 unparsed-text 같은 XSLT 2.0 기능을 사용하여 XSLT 1.0 프로세서, 당신은 XSLT 2.0 색슨 9 XmlPrime 또는 AltovaXML을 사용할 필요가 XslCompiledTransform 불가능합니다.

xsl:parampathToCSV으로 게시 된 스타일 시트에 매개 변수를 전달할 수 있습니다.이 매개 변수를 전달하는 방법은 사용할 XSLT 프로세서의 API (또는 명령 줄 매개 변수 if 명령 행에서 스타일 시트를 실행하기 만하면됩니다).

+0

명령 줄이 아닌 코드에서 XSLT 1.0을 사용하여이 작업을 수행해야합니다. XslCompiledTransform 명령은 XML 소스를 가져 오려고하지만 xslt 파일에 정의 된 CSV 파일을 사용하려고합니다. 이 명령으로 가능합니까? – Retrocoder

+0

Martin이 말했듯이, 당신의 코드는 XSLT 2.0을 사용하는 것에 완전히 의존합니다. XSLT 1.0을 고수하고 싶다면 자신 만의 확장 기능을 구현하는 방법을 찾아야 할 것입니다. 그러나 Microsoft 이외의 회사의 .NET에서 XSLT 2.0을 제대로 지원합니다. –

+0

그래, 내가 쓰는대로 나는 색슨을 다운로드 중이다. 모든 도움에 감사드립니다. – Retrocoder

관련 문제